如何重置JSESSIONID

在用户进行身份validation时重置会话cookie被认为是一种很好的安全做法。

如何用Java做到这一点?

到目前为止我的尝试是成功的,但我想知道是否有更好的方法:

public static HttpSession resetSessionId(HttpSession session, HttpServletRequest request) { session.invalidate(); session = request.getSession(true); return session; } 

你的答案似乎是最佳的 另一种方法是以这种方式直接操纵厨师:

  Cookie cookie = new Cookie ("JSESSIONID", "randomValue"); cookie.setMaxAge( 0 ); 

因此,您创建一个具有相同名称的新cookie并立即使其过期,但我不建议采用这种方式,因为对于熟悉基本Servlet API的人来说,它更清晰,更明显。

我只传递了我收到会话的请求。 如果一个会话尚不存在,那么创建一个会话就没有意义。 如果会话刚刚由容器创建(由于用户第一个http请求直接在登录表单上),这也成立。

 public static ... (HttpServletRequest request) { HttpSession session = request.getSession(false); if (session!=null && !session.isNew()) { session.invalidate(); } 

Tomcat(自6.0.24 AFAIK起)可以自动更改身份validation的sessionId – 只要您使用标准的servlet身份validation机制(基本的,基于表单的身份validation)。 这可以通过基本身份validation器Valve的changeSessionIdOnAuthentication进行配置: http : //tomcat.apache.org/tomcat-6.0-doc/config/valve.html

另一种方式(不是更好的方法)是调用org.apache.catalina.session.StandardManager ‘changeSessionId(existingSession)’,它将当前会话的会话ID更改为新的随机生成的会话ID。

您必须使用StandardManager Mbean来调用该方法。 请参阅Tomcat MBeans

伪代码:

ObjectName contextObjectName = new ObjectName(“Catalina:type = Manager,path = / whatever,host = whateverhost”);

mbeanServer.invoke(contextObjectName,“changeSessionId”,new Object [] {session},new String [] {“javax.servlet.http.HttpSession”});