会话ID更改和登录后的属性复制

时间:2011-05-18 09:55:02

标签: java spring session tomcat servlets

我的应用程序使用java servlets,jsp和tomcat 6.我喜欢实现会话ID更改,并希望在登录后将旧会话属性复制到新的会话属性。我们开始在这里使用一点点弹簧。 哪个是将此功能添加到这样一个10岁的应用程序的最佳方式。

3 个答案:

答案 0 :(得分:9)

如果使用Spring Security,默认情况下,框架应在登录后更改会话ID。

@see Spring Security FAQ

  

为什么在通过Spring Security进行身份验证时会话ID会发生变化?

     

使用默认配置,当用户进行身份验证并创建新会话时,Spring Security会使现有会话失效,并将会话数据传输给它。目的是更改会话标识符以防止“会话固定”攻击。您可以在线和参考手册中找到更多相关信息


如果您不使用Spring(安全),则必须由您自己执行。有点像这样:

public class Login extends HttpServlet {
...
    HttpSession session = request.getSession();
    Map<String,Object> values = session.GetAll(); //This line is psydo code
    //Use getValueNames() and a loop with getValue(String name);

    // Kill the current session
   session.invalidate();

   HttpSession newSession = request.getSession(true);
   newSession.putAllValues(values); //This line is psydo code
... 

答案 1 :(得分:1)

    session=request.getSession(true);
    Enumeration keys = session.getAttributeNames();     
    HashMap<String,Object> hm=new HashMap<String,Object>();  
    while (keys.hasMoreElements())
    {
      String key = (String)keys.nextElement();
      hm.put(key,session.getValue(key));
      session.removeAttribute(key);      
    }
    session.invalidate();
    session=request.getSession(true);
    for(Map.Entry m:hm.entrySet())
    {
      session.setAttribute((String)m.getKey(),m.getValue());  
      hm.remove(m);
    }  

答案 2 :(得分:0)

这可能会有所帮助

Cookie cookie = new Cookie("JSESSIONID", null);
cookie.setPath("/");
cookie.setMaxAge(0);
response.addProperty(cookie);