如何重置JSESSIONID

时间:2011-01-29 09:31:43

标签: java jsp servlets

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

如何用Java做到这一点?

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

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

4 个答案:

答案 0 :(得分:3)

我只传递了获取会话的请求。如果会话尚不存在,那么创建一个会话就没有意义使其无效。如果会话刚刚由容器创建(由于用户首次直接在登录表单上发出http请求),这也成立。

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

答案 1 :(得分:2)

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

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

所以你创建一个具有相同名称的新cookie并立即过期,但我不建议这样做,因为对于熟悉基本Servlet API的人来说,你的内容更清晰,更明显

答案 2 :(得分:2)

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

答案 3 :(得分:1)

另一种方式(不是更好的方法)是调用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”});