2

要求是登录前后的 JSESSIONID 必须不同。

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

我的代码是

  1. 成功登录后(在 loginwebaction 中),
  2. 将所有属性从会话复制到地图,
  3. 使会话无效,
  4. 重新创建会话HttpSession session = request.getSession(true);
  5. 将所有属性从地图复制到新会话,

登录成功后Jsessionid发生变化,显示loginsuccess.jsp。但我有一个问题。

在此之后,如果我单击任何其他链接以执行其他操作,它会点击过滤器。在过滤器中,如果他已登录,我必须检查会话以获取用户信息,否则必须显示错误页面。

HttpSession session = request.getSession();
if(null == session.getAttribute("USER_INFO")){
    //redirect to error page
}

问题是:在过滤器中访问的会话是新的,不知道它是如何重新创建的。过滤器中的代码是

任何人都可以帮我解决这个问题,如何进一步纠正这个会话变化?

4

1 回答 1

1

如我所见,您的代码中的问题是:

HttpSession session = request.getSession();

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

HttpSession session = request.getSession(false);

这将确保它返回现有的会话对象(如果有效),或者如果没有会话则返回 null。

再补充一点,以下代码行实际上是相同的:

HttpSession session = request.getSession();
//Overloaded getSession with 'true' boolean argument
HttpSession session = request.getSession(true);

希望这可以帮助。

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

于 2013-06-18T18:26:01.517 回答