我读到要在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);
}
}
答案 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 做两件事 -