【问题标题】:After invalidate(), is it possible to get a new session from the request object?在 invalidate() 之后,是否可以从请求对象中获取新的会话?
【发布时间】:2013-08-18 19:47:09
【问题描述】:

会话失效后,是否可以通过request对象通过request.getSession()获取新的会话而不发起新的请求?

我的请求对象流到第 1 页到第 2 页和第 2 页到第 1 页再次第 1 页到第 2 页和再次相同的第 2 页到第 2 页 ....请求页面不能更改,但每次请求第 1 页到第二页我们需要获取会话的详细信息并使其无效并再次创建它.. 像这样

HttpSession session = request.getsession(false)
String user = (String)session.getAttribute("name");
session.invalidate();
session=request.getSession(true);
RequestDispacher dis = request.requestDispatcher("path");
dis.forword(request,respone);

但这不适用于第二次 它给出了空会话或详细信息

还尝试在即将到来的 cookie 中设置会话 ID 像这样

Cookie[] c = request.getCookies();
            for(Cookie k: c){
                if(k.getName().equalsIgnoreCase("JSESSIONID")){
                    System.out.println("k.getValue() : "+k.getValue());
                    System.out.println("httpSession.getId() : "+httpSession.getId());
                    k.setValue(httpSession.getId());
                }
            }

【问题讨论】:

  • 如果需要,为什么要使会话无效?
  • 出于安全目的

标签: session servlets invalidation


【解决方案1】:

根据Javadocs,只需拨打request.getSession()

返回与此请求关联的当前 HttpSession,或者,如果没有当前会话并且 create 为 true,则返回一个新会话。

如果 create 为 false 并且请求没有有效的 HttpSession,这 方法返回 null。

为确保会话得到正确维护,您必须调用此 提交响应之前的方法。如果容器正在使用 cookie 以保持会话完整性,并被要求创建一个新的 提交响应时的会话,IllegalStateException 是 扔了。

因此调用getSession 方法将为您创建一个新会话:

final HttpSession session = request.getSession()

这是一个证明代码有效的示例 JSP:

test.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Session invalidation test</title>
</head>
<body>
<% 

// Uses implicit session for JSP

out.println("Session is " + session);
session.invalidate();
out.println("\nNew session is " + request.getSession());

request.getRequestDispatcher("/test2.jsp").forward(request, response);

%>
</body>
</html>

test2.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Session invalidation test</title>
</head>
<body>
<% 

out.println("Session is " + request.getSession());

%>
<h1>Test 2</h1>
</body>
</html>

在Tomcat6上执行时,我浏览器的输出是:

Session is org.apache.catalina.session.StandardSessionFacade@9317bfb
Test 2

表示test.jsp已被执行并成功转发到test2.jsp。

【讨论】:

  • 您也可以只使用request.getSession() 而不使用布尔参数。
  • 我同意你的回答,但我的问题是在这之后 out.println("Session is " + session); session.invalidate(); out.println("新会话是" + request.getSession());并调用请求调度程序并转发到另一条路径并调用会话 request.getSession 所以我可以得到它它给出 null 但我需要在我的项目中维护会话并且还需要我的会话没有人知道它
  • 我认为您需要认真评估您的需求并真正了解安全性的含义,以及如何使用 Java EE 实现它,并且可能咨询安全 Web 应用程序方面的专家。看看 OWASP 并首先了解这一点。
  • 查看我的更新答案;我已经扩展了我的测试来向你证明什么是有效的。
【解决方案2】:

invalidate()之后

你应该写

req.getSession(true)

然后getSession() 方法将检查是否已经存在会话。如果session 存在,它将return 该会话对象,否则将创建一个新会话并返回给客户端。

否则如果你尝试做类似的事情

session.inValidate();
session..trySomething()  //leads to exception "Session already invalidated."

【讨论】:

  • 我试试这个,但下次我们在同一个请求对象上获取会话对象时......它给出了 null ....
  • +1 用于解释如何通过尝试在无效会话上调用方法来引发异常。谢谢。
猜你喜欢
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2021-10-23
  • 2016-11-16
相关资源
最近更新 更多