【问题标题】:How to forcibly create a new session in Java Servlets如何在 Java Servlet 中强制创建新会话
【发布时间】:2012-08-06 21:20:06
【问题描述】:

我在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)

【问题讨论】:

  • 我会说您的注销已损坏。或您的登录名。或两者兼而有之。
  • 我不这么认为,Dave.Login 只是一个 html 页面,一切都在这里的 servlet 中处理。
  • 真的吗?唔。因为通常在注销时您会使当前会话无效(或者如果您不注销,则在登录时,或者您应该只运行注销代码)。但会话 ID 并不是真正的门控问题——会话 in 中的内容是最重要的。如果会话或数据库中仍有旧数据,则登录或注销都已损坏(或两者兼有)。
  • 戴夫,为问题添加了更多细节。我同意你的invalidate,但得到上述例外。我没有退出。刚刚登录,如果新用户想登录,他再次点击登录。

标签: servlets session-timeout sessionid


【解决方案1】:

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

【讨论】:

  • 我该怎么做?请问你的想法?
  • 谢谢戴夫。您的回答对我有帮助,我在 - killsession 找到了详细信息。
  • @anujin 很高兴你解决了这个问题——但是将变量设置为新值不需要任何研究,不是吗?
  • 绝对:)。 getSession 有点偏离轨道,而忽略了 session 变量。
【解决方案2】:

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

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

所以注销时失效很重要。

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

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 2010-12-22
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 2021-05-24
    • 2013-12-06
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多