使用JSESSIONID cookie的servlet中的会话处理没有获得会话

时间:2017-06-08 06:42:18

标签: java session servlets cookies jsessionid

我读到要在servlet中持久化会话, cookie在客户端保存,名称为JSESSIONID

我也检查了它,我找到了<的cookie strong> localhost ,名称为 JSESSIONID 某些随机字符串值

所以我尝试通过在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);
}

}

2 个答案:

答案 0 :(得分:2)

您不负责创建或跟踪Cookie。 servlet容器为您提供此服务。

一旦你调用:

   HttpSession session = request.getSession(true);

   HttpSession session = request.getSession();

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

HttpSession对象在请求之间的服务器内存中维护,通常由会话ID查找。如果你自己创建cookie,服务器将不会知道任何关于它或任何相关的HttpSession。

答案 1 :(得分:0)

第一次运行代码后,会话将为空,您将指示浏览器(或任何其他客户端)创建 JESSIONID cookie。到这里都是正确的。

现在,当您再次发出请求时,浏览器(或任何其他客户端)会将 cookie 附加到请求中,并且 tomcat(或任何其他 servlet 引擎)将收到 JESSIONID。到这里一切都好了。

但是现在怎么办? Tomcat(或任何其他 servlet 引擎)然后将搜索它是否有任何具有 sessionID“12345”的 HttpSession 对象。你认为它会被发现吗?号

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

这就是我们使用 request.getSession() 的原因。它指示 tomcat 做两件事 -

  1. 无论您做了什么,即通过名称 JSESSIONID 和随机 ID 添加设置 Cookie 信息作为响应。
  2. 创建对应的HttpSession对象并保存在内存中(默认情况下),以便下次请求来的时候,通过找到对应的HttpSession对象,将JESSIONID识别为有效的会话ID。您的代码遗漏了这一点。