Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 登录后会话id更改和属性复制_Java_Spring_Session_Tomcat_Servlets - Fatal编程技术网

Java 登录后会话id更改和属性复制

Java 登录后会话id更改和属性复制,java,spring,session,tomcat,servlets,Java,Spring,Session,Tomcat,Servlets,我的应用程序使用Javaservlet、jsp和Tomcat6。我喜欢实现会话id更改,并希望在登录后将旧会话属性复制到新会话属性。我们开始在这里使用一点弹簧。 这是将此功能添加到10年前的应用程序中的最佳方法。如果使用Spring Security,默认情况下,框架应在登录后更改会话id @见: 当我通过Spring Security进行身份验证时,会话Id为什么会更改 在默认配置下,当用户进行身份验证并创建新会话时,Spring Security会使现有会话无效,并将会话数据传输给它。其目的

我的应用程序使用Javaservlet、jsp和Tomcat6。我喜欢实现会话id更改,并希望在登录后将旧会话属性复制到新会话属性。我们开始在这里使用一点弹簧。
这是将此功能添加到10年前的应用程序中的最佳方法。

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

@见:

当我通过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
... 
公共类登录扩展了HttpServlet{
...
HttpSession session=request.getSession();
Map values=session.GetAll();//这一行是psydo代码
//使用getValueNames()和带有getValue(字符串名称)的循环;
//终止当前会话
session.invalidate();
HttpSession newSession=request.getSession(true);
newSession.putAllValues(values);//此行是psydo代码
... 
这可能会有所帮助

Cookie cookie = new Cookie("JSESSIONID", null);
cookie.setPath("/");
cookie.setMaxAge(0);
response.addProperty(cookie);
session=request.getSession(true);
枚举键=session.getAttributeNames();
HashMap hm=新的HashMap();
while(keys.hasMoreElements())
{
String key=(String)keys.nextElement();
hm.put(key,session.getValue(key));
会话。removeAttribute(键);
}
session.invalidate();
session=request.getSession(true);
对于(Map.Entry m:hm.entrySet())
{
session.setAttribute((字符串)m.getKey(),m.getValue());
hm.m;
}  

为什么需要更改会话id?@christoff Hammarström:登录后更改会话id可防止会话劫持。当我调用session.invalidate()时is抛出异常。java.lang.IllegalStateException:getLastAccessedTime:会话已无效据我所知:文档说您不需要做任何事情。在尝试实现您自己的逻辑之前,您是否检查过会话id不会自动更改?抱歉。上下文不同。它与spring securityHi无关!有没有办法在登录后添加会话属性?我应该把添加属性的部分放在哪里?我正在使用Spring Securitycase@DhruvSinghal:您可以实现一个
AuthenticationSuccessHandler
,以便在成功登录后访问Http会话(不要忘记调用“原始”
AuthenticationSuccessHandler
。或者您连接到
AuthenticationSuccessEvent
InteractiveAuthenticationSuccessEvent
并尝试通过
RequestContextHolder
访问http请求(我以前从未使用过
RequestContextHolder
,因此我不知道如何让它运行)更多的解释有助于人们更清楚地理解
    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);
    }