Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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/1/angular/26.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 成功登录后将自动重新创建JSESSIONID_Java_Session_Jsessionid - Fatal编程技术网

Java 成功登录后将自动重新创建JSESSIONID

Java 成功登录后将自动重新创建JSESSIONID,java,session,jsessionid,Java,Session,Jsessionid,要求JSSessionID在登录前后必须不同 流程是login.jsp->loginwebaction->loginsAccess.jsp->filter->otheraction 我的代码是 成功登录后(在loginwebaction中) 将所有属性从会话复制到映射 宣布会议无效 重新创建会话HttpSession session=request.getSession(true) 将所有属性从映射复制到新会话 成功登录后JSSessionID将发生更改,并显示loginsAccess.jsp。

要求JSSessionID在登录前后必须不同

流程是login.jsp->loginwebaction->loginsAccess.jsp->filter->otheraction

我的代码是

  • 成功登录后(在loginwebaction中)
  • 将所有属性从会话复制到映射
  • 宣布会议无效
  • 重新创建会话
    HttpSession session=request.getSession(true)
  • 将所有属性从映射复制到新会话
  • 成功登录后JSSessionID将发生更改,并显示loginsAccess.jsp。但我有一个问题

    在这之后,如果我点击任何其他链接进行其他操作,它会点击一个过滤器。 在filter中,如果他已登录,我必须检查会话中的用户信息,否则必须显示错误页面

    HttpSession session = request.getSession();
    if(null == session.getAttribute("USER_INFO")){
        //redirect to error page
    }
    
    问题是:在筛选器中访问的会话是新的,不知道如何重新创建。过滤器中的代码是


    有人能帮我解决这个问题吗?如何进一步纠正此会话更改?

    正如我所看到的,您代码中的问题是:

    HttpSession session = request.getSession();
    
    从,
    request.getSession()
    创建一个新会话(如果没有现有会话)。您需要将其更改为:

    HttpSession session = request.getSession(false);
    
    这将确保它返回现有会话对象(如果有效),如果没有会话,则返回null

    除此之外,以下代码行实际上是相同的:

    HttpSession session = request.getSession();
    //Overloaded getSession with 'true' boolean argument
    HttpSession session = request.getSession(true);
    
    希望这有帮助


    如果这不能解决您的问题,那么问题可能是其他问题。请添加用例的框架代码,以便我可以尝试一下。

    当显示loginsucess.jsp时,浏览器http响应头是否包含新的或旧的JSSessionID?要看到这一点,您可能必须跟踪http消息或使用浏览器调试来查看Cookie/页面源。可能您需要在响应中手动设置新的JSSessionID标头?无法再现错误,请发布源代码和配置详细信息。您是否检查了客户端是否有多个会话协作?是,在某些情况下可能会发生这种情况。您还可以使用查看客户端和服务器之间交换的请求和响应。另一种方法可能是在创建/销毁会话时使用日志。我认为这没有帮助。正如giri所写,过滤器看到的会话是新的。如果筛选器是创建新会话的筛选器,则您的建议只会返回
    null
    ,但此时应该有一个现有会话。