如何在Java Servlet中强制创建新会话

时间:2012-08-09 15:40:57

标签: servlets session-timeout sessionid

我在log in时间将会话ID存储在数据库中。我面临的问题是,如果不同的用户在第一个用户之后登录,则在DB中输入相同的会话,welcome username仍然反映在同一台计算机上首先登录的用户的名称。我想在每次用户登录时创建一个新的会话ID,但不知怎的,我的代码不起作用。

HttpSession session = request.getSession();
String sessionID;
request.getSession(true);
sessionID = session.getId();

注意:当用户单击“登录”按钮并将其包含在servlet中时,将调用上面的代码。

会话ID仍然具有旧的会话值,直到旧的会话值默认过期。意思是如果10个用户登录,则所有用户都具有相同的会话ID和相同的欢迎名称。

需要大师的专家意见:)如果我错过任何需要提供的细节,请告诉我。

如果我使用 -

if(session.isNew()){
            System.out.println("New session created by default");
            request.getSession(true);
            sessionID = session.getId();
            createTime = new Date(session.getCreationTime());
            lastAccessTime = new Date(session.getLastAccessedTime());
            initialtime = System.currentTimeMillis();
        }else{
            System.out.println("You have created a new session");
            request.getSession().invalidate();
            request.getSession(true);
               sessionID = session.getId();
            createTime = new Date(session.getCreationTime());
            lastAccessTime = new Date(session.getLastAccessedTime());
            initialtime = System.currentTimeMillis();
         }

获得以下异常 -

SEVERE: Servlet.service() for servlet LoginToApp threw exception
java.lang.IllegalStateException: getCreationTime: Session already invalidated
    at org.apache.catalina.session.StandardSession.getCreationTime(StandardSession.java:1025)
    at org.apache.catalina.session.StandardSessionFacade.getCreationTime(StandardSessionFacade.java:74)
    at LoginToApp.doGet(LoginToApp.java:56)
    at LoginToApp.doPost(LoginToApp.java:208)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:843)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:679)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1303)
    at java.lang.Thread.run(Thread.java:595)

2 个答案:

答案 0 :(得分:1)

session变量设置为新会话:您正在尝试使用旧的,无效的变量。

答案 1 :(得分:0)

首先,您必须在注销时使会话无效,这会删除服务器中的会话及其相关数据。

实际上,会话ID也存储在客户端浏览器cookie中,其名称为jsessionid,即使在会话无效之后它仍保留在客户端中,但在服务器中被删除,因此当具有过期jsessionid Server的用户请求知道该会话时无效,因此创建新的。

因此注销时无效是很重要的。

 HttpSession session = request.getSession(false); 
 session.invalidate();    

即使您想在注销时清除客户端中当前会话的数据。使用以下代码。

Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        cookie.setMaxAge(0);
        cookie.setValue(null);
        cookie.setPath("/");
        response.addCookie(cookie);
    }