5

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

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

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());
                }
            }
4

2 回答 2

4

根据Javadocs,只需调用request.getSession()

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

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

为确保正确维护会话,您必须在提交响应之前调用此方法。如果容器正在使用 cookie 来维护会话完整性,并且在提交响应时被要求创建新会话,则会引发 IllegalStateException。

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

final HttpSession session = request.getSession()

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

测试.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。

于 2013-08-16T13:53:02.753 回答
0

之后invalidate()

你应该写

req.getSession(true)

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

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

session.inValidate();
session..trySomething()  //leads to exception "Session already invalidated."
于 2013-08-16T11:56:31.203 回答