在Java Servlet API中,如何确保某人的会话ID不被盗?
例如,如果我有一个活跃的会话,而某人以某种方式获得我的会话ID,他们可以使用它吗?
我需要在Java中实现我自己的HttpSession版本.我发现很少的信息可以解释如何实现这样的壮举.
我想我的问题是 - 无论应用服务器的实现如何,我如何覆盖现有的HttpSession?
我确实遇到过质量但相当旧的阅读,这有助于我实现自己的目标 - http://java.sun.com/developer/technicalArticles/Servlets/ServletControl/
还有其他方法吗?
HTTPSession变量可以容纳的数据的最大限制(即大小)是多少?如果超过这个会发生什么?最重要的是,如果大小超过HTTPSession变量可以容纳的最大大小,那么在整个会话中获取数据的替代方法是什么?
我最近正在努力学习Spring MVC.似乎我不太了解@ModelAttribute注释和HttpSession的功能.
@SessionAttributes({"shoppingCart", "count"})
public class ItemController {
@ModelAttribute("shoppingCart")
public List<Item> createShoppingCart() {
return new ArrayList<Item>();
}
@ModelAttribute("count")
public Integer createCount() {
return 0;
}
@RequestMapping(value="/addToCart/{itemId}", method=RequestMethod.GET)
public ModelAndView addToCart(@PathVariable("itemId") Item item,
@ModelAttribute("shoppingCart") List<Item> shoppingCart, @ModelAttribute("count") Integer count) {
if(item != null) {
shoppingCart.add(item);
count = count + 1;
}
return new ModelAndView(new RedirectView("showAllItems")).addObject("count", count);
}
@RequestMapping(value="/deleteFromCart/{itemId}", method=RequestMethod.GET)
public ModelAndView deleteFromCart(@PathVariable("itemId") Item item,
HttpSession session) {
List<Item> list = (List<Item>) session.getAttribute("shoppingCart");
list.remove(item);
//session.setAttribute("shoppingCart", list);
Integer count = (Integer) session.getAttribute("count");
count …Run Code Online (Sandbox Code Playgroud) spring session-variables spring-mvc httpsession modelattribute
我很困惑,因为我尝试启动的每个应用程序 100% 都会出现此问题,但我找不到有关此问题的任何信息,而且我在互联网上找不到其他任何人有这个问题。
我使用 Google Cloud Platform 学习 Java Web 开发已经大约一年了,我有一个问题已经困扰了几个月了。我似乎在网上找不到任何提及此问题的信息。
我有一个基于 Java servlet 构建的 Web 应用程序,它使用会话来跟踪登录的用户。应用程序中的所有内容都工作正常,但是当我将应用程序部署到 App Engine 时,用户不断通过后续服务器请求随机登录和注销。我在开发窗口中观察,发现会话 ID 不断在两个不同的值之间变化。
由于应用程序引擎使用应用程序的多个实例来扩展流量和资源管理,因此它可能会在一个实例上接收请求并将其从另一实例发送回客户端。这在客户端没有明显的差异,但我发现每个实例对于我的客户端都有不同的会话 ID,导致每个实例中陷入不同的会话属性。
果然,当我将应用程序减少到一个实例时,我的会话运行良好。但这在生产中行不通,我需要我的应用程序能够根据流量进行扩展并按预期利用应用程序引擎资源。
Google 声称应用程序引擎上的会话是使用 Memcache 和 Datastore 自动处理的,并且访问会话所需要做的就是 use request.getSession(),所以我不明白为什么会出现这个问题。如果我无法理解问题,我将永远找不到解决方案:(
[编辑]:该应用程序使用一个名为 DatastoreSessionFilter 的预先存在的 Web 过滤器来使用 cookie 和数据存储来跟踪会话变量,但它似乎无法正常工作,因为我的会话变量被困在各个实例中。这是 DatastoreSessionFilter 类:
@WebFilter(filterName = "DatastoreSessionFilter",
urlPatterns = { "",
"/LoginEmail",
"/Logout",
"/ResetPassword",
"/SignupEmail",
"/VerifyEmail",
"/About",
"/BulkUpload",
"/DeleteAlbum",
"/DeletePost",
"/EditAlbum",
"/EditPost",
"/Events",
"/EventsScroll",
"/Home",
"/HomeScroll",
"/Info",
"/ListAlbums",
"/ListAlbumsScroll",
"/NewAlbum",
"/NewPost",
"/Support",
"/Videos",
"/VideosScroll",
"/ViewAlbum",
"/ViewAlbumScroll",
"/ViewPost",
"/ViewProfile",
})
public …Run Code Online (Sandbox Code Playgroud) 我继承了一个非常古老的JSP应用程序(JDK 1.3.1_15),并试图插入会话固定漏洞.
我在使用身份验证后成功地使当前会话无效,HttpSession.invalidate()但是在创建新会话时,会重新使用旧会话ID.
<%
// login.jsp
if (authenticated) {
request.getSession().invalidate();
// create new session and store data
HttpSession session = request.getSession();
session.putValue(...);
// etc
response.sendRedirect("logged-in.jsp");
return;
}
%>
Run Code Online (Sandbox Code Playgroud)
我可以在HTTP监视器中看到新的会话分配,它只是再次使用相同的号码.
-- Initial request response --
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=6a303082951311647336934;path=/
-- login.jsp request response --
HTTP/1.1 302 Moved Temporarily
Location: http://example.com/logged-in.jsp
Set-Cookie: JSESSIONID=6a303082951311647336934;path=/
Run Code Online (Sandbox Code Playgroud)
在我使用session.invalidate()第二个Set-Cookie响应头之前根本不存在.
有没有人对如何生成新的会话ID有任何建议?我对JRUN4不是很熟悉,但是通过配置文档进行拖网并没有发现任何问题.
我知道 REST 不应该使用HttpSession. 另一方面,REST 服务在 servlet 容器中运行。从我看到的情况来看,HttpSession只有在以下情况下才会创建对象:
HttpSession session = request.getSession();
Run Code Online (Sandbox Code Playgroud)
代码被执行。总是这样吗?除了使用JSP?
我的问题是:HttpSession执行 REST 方法时是否会创建对象?
假设我使用 JAX-RS 框架,如果它有什么不同的话。
如果未创建此类对象,则实际上可能意味着服务器内存的大小可能不会增长,而不管有多少客户端在服务器上使用它。
我们在 Jquery 中使用短轮询定期向服务器发送 ajax 请求,以检查服务器上是否有任何更新。轮询工作正常,但因此,会话始终保持活动状态。除非用户手动注销或关闭浏览器,否则会话永远不会超时。这可以通过在轮询本身中设置超时来实现,但我们希望在服务器端处理超时逻辑。
有没有办法在这些 ajax 调用期间保持会话空闲。或者我们需要手动处理超时。
我们使用 tomcat 作为应用服务器,使用 spring mvc 作为视图和控制器。一旦创建新会话,我就设置了会话超时。
session.setMaxInactiveInterval(7200); //2小时
在这方面的任何帮助表示赞赏。
谢谢,伊卡纳特
我目前正在使用struts2进行工作,突然出现此错误.我的对象的某些缓存不起作用.
我使用JBoss 5和struts2:struts2-core-2.3.4.1.jar xwork-core-2.3.4.1.jar
堆栈跟踪在这里:http://pastebin.com/QpPV01wX
这是一些片段:
java.io.NotSerializableException: com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at com.opensymphony.xwork2.inject.util.ReferenceMap.writeObject(ReferenceMap.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1469)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)
at java.util.HashMap.writeObject(HashMap.java:1001)
at sun.reflect.GeneratedMethodAccessor413.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945)
at …Run Code Online (Sandbox Code Playgroud) 这是我的 Spring MVC 控制器代码:
session.setAttribute("YourProperty", "arg1");
Run Code Online (Sandbox Code Playgroud)
如何使用 JavaScript 访问存储在 HttpSession 中的属性?
我尝试过使用这段代码:
var property = <%=session.getAttribute("YourProperty")%>;
alert(property);
Run Code Online (Sandbox Code Playgroud)
但它返回 null。
谢谢
httpsession ×10
java ×5
servlets ×5
jsp ×3
ajax ×1
cookies ×1
java-ee ×1
javascript ×1
jax-rs ×1
jquery ×1
jrun ×1
rest ×1
security ×1
serializable ×1
session ×1
spring ×1
spring-mvc ×1
timeout ×1