【问题标题】:Session Handling in servlet using JSESSIONID cookie not getting session使用 JSESSIONID cookie 的 servlet 中的会话处理未获得会话
【发布时间】:2017-11-09 17:44:58
【问题描述】:

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

我也检查了它,发现 的 cookie 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);
}

}

【问题讨论】:

    标签: java session servlets cookies jsessionid


    【解决方案1】:

    您不负责创建或跟踪 cookie。 servlet 容器会为您处理这个问题。

    一旦你调用:

       HttpSession session = request.getSession(true);
    

       HttpSession session = request.getSession();
    

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

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

    【讨论】:

      【解决方案2】:

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

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

      但是现在呢? Tomcat(或任何其他 servlet 引擎)然后将搜索它是否有任何具有 sessionID“12345”的 HttpSession 对象。你觉得会被发现吗?没有。

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

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

      1. 无论您做什么,即添加 Set Cookie 信息以响应名称 JSESSIONID 和随机 ID。
      2. 创建一个对应的HttpSession对象并保存在内存中(默认),这样下次请求来的时候,通过找到对应的HttpSession对象就可以识别出这个JESSIONID是一个有效的会话ID。您的代码错过了这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-13
        • 2012-03-18
        • 2018-05-25
        • 2012-06-28
        • 2021-02-21
        • 2015-02-25
        • 2015-01-02
        • 1970-01-01
        相关资源
        最近更新 更多