Java 使用JSESSIONID cookie在servlet中处理会话未获取会话

Java 使用JSESSIONID cookie在servlet中处理会话未获取会话,java,session,servlets,cookies,jsessionid,Java,Session,Servlets,Cookies,Jsessionid,我读到,为了在servlet中持久化会话,一个名为JSESSIONID的cookie被保存在客户端我也检查了它,发现名为JSESSIONID的localhostcookie带有一些随机字符串值。 因此,我试图通过在servlet中创建JSESSIONID cookie来手动创建会话,但当我试图获取会话时,它不起作用。 这里发生了什么事? 除了cookie(JSESSIONID)之外,还有其他东西可以存储在会话创建的何处吗如果没有,为什么我无法获得会话? 请帮忙 我用来创建cookie和获取会话的

我读到,为了在servlet中持久化会话,一个名为JSESSIONID的cookie被保存在客户端

我也检查了它,发现名为JSESSIONID的localhostcookie带有一些随机字符串值。

因此,我试图通过在servlet中创建JSESSIONID cookie来手动创建会话,但当我试图获取会话时,它不起作用。

这里发生了什么事?

除了cookie(JSESSIONID)之外,还有其他东西可以存储在会话创建的何处吗

如果没有,为什么我无法获得会话?

请帮忙

我用来创建cookie和获取会话的代码

package sessionHandling;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/sessionhandling")
public class SessionHandling extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletOutputStream out = response.getOutputStream();
    out.print("Hello Mr.! How are you?");
    HttpSession session = request.getSession(false);
    if(session != null){
        out.println("You are logged in.");

        out.println("session found with "+session.getId());
        out.println("session found with "+session.getLastAccessedTime());

    }else{
        //session = request.getSession(true);
        Cookie JSESSIONID = new Cookie("JSESSIONID", "12345");
        JSESSIONID.setMaxAge(-1);
        response.addCookie(JSESSIONID);
        System.out.println("Cookie Created");

        out.print("You are not logged in");
    }
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

}

您不负责创建或跟踪cookie。servlet容器将为您处理此问题

一旦调用:

   HttpSession session = request.getSession(true);

然后servlet容器将开始为您维护会话(并根据需要生成cookie)


HttpSession
对象在请求之间保存在服务器内存中,通常由会话id查找。如果您自己创建cookie,服务器将不知道它或任何关联的HttpSession的任何信息。

一旦您运行代码,第一次会话将为null,您将指示浏览器(或任何其他客户端)创建JESSIONID cookie。在此之前,一切都是正确的

现在,当您再次发出请求时,浏览器(或任何其他客户机)将把cookie附加到请求,tomcat(或任何其他servlet引擎)将收到JESSIONID。在这里,一切正常

但是现在呢?Tomcat(或任何其他servlet引擎)将搜索它是否有任何会话ID为“12345”的HttpSession对象。你认为会找到它吗?不会

为什么?您上面编写的代码只是在响应消息中设置cookie头。它没有指示tomcat(或任何其他servlet引擎)将这个名为cookie的JSESSIONID视为会话Id,并在Java堆内部创建相应的HttpSession对象

这就是为什么我们使用
request.getSession()
。它指示tomcat做两件事-

  • 无论您做了什么,即通过名称JSESSIONID和随机ID添加Set Cookie info作为响应
  • 创建相应的HttpSession对象并将其保存在内存中(默认情况下),以便下次请求时,它可以通过查找相应的HttpSession对象将JESSIONID识别为有效的会话ID。您的代码没有找到该对象
  •    HttpSession session = request.getSession();