在invalidate()之后,是否可以从请求对象获取新会话?

时间:2013-08-16 11:52:53

标签: session servlets invalidation

会话失效后,是否可以通过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());
                }
            }

2 个答案:

答案 0 :(得分:3)

根据Javadocs,只需致电request.getSession()

  

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

     

如果create为false且请求没有有效的HttpSession,则为此   method返回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。

答案 1 :(得分:0)

invalidate()

之后

你应该写

req.getSession(true)

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

否则,如果您尝试执行类似

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