如果客户端不接受cookie,java如何处理会话?理解反应。Servlet中的encodeURL()
我正在练习维护客户端和服务器之间的会话。为此,我使用了存储在cookie中的JSESSIONID的简单解决方案。所以我的小程序是这样工作的:
索引。html:
<html><body>
<form action="testing">
<input type="text" name="animal">
<button>Go</button>
</form>
</body></html>
我的服务。java(在XML中映射为/testing):
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
String name = req.getParameter("animal");
PrintWriter pw = resp.getWriter();
pw.print("Welcome " + name + "<br>");
HttpSession session = req.getSession();
if (session.isNew()) {
pw.print("New session: " + session.getId() + "<br>");
} else {
pw.print("Old session: " + session.getId() + "<br>");
}
pw.print("<a href=\'index.html\'> Home </a>");
}
}
所以,若我从表单提交了两次以上的内容,服务器应该“找到”我的JSESSIONID存储在堆中。以下是提交表单时的外观图片(我在输入中键入了“parrot”):
但后来我在浏览器中禁用了cookies。之后,我的服务器再也找不到用户的JSESSIONID,因为用户从未将其存储在任何地方。请记住,以前,JSESSIONID存储在cookie中,但由于我禁用了它们,它不可能再将其存储在cookie中。所以现在,我被困住了
在这种情况下我能做什么?我发现response.encodeURL()
使用URL并将其JSESSIONID附加到URL中。但我很难理解如何实现它以及它如何在内部工作。有人能告诉我如何使用encodeURL()
解决这个问题,并实际解释代码在实现之后是如何工作的吗
# 1 楼答案
你可以做点什么。这用于将您的JSESSIONID附加到您将检索给用户的url,以便用户可以在其中导航并维护他们是谁的信息。了解它的内部工作原理很简单,正如您所见,它只是将id附加到您传递的url,用户信息如何存储,是您在服务器端的功能,您将在下一个请求中使用用户提供的id来检索信息
编辑: 你把它放在代码的这一部分
# 2 楼答案
根据the specification,服务器应该支持几种跟踪会话的方法:使用cookie、SSL会话或URL重写
您询问的是URL重写,其工作原理如下:
请注意,它是一个路径参数,而不是查询参数。您的查询参数如下所示:
服务器自动支持这种机制来跟踪会话,但很明显,您需要帮助服务器。要做到这一点,请确保所有链接都包含
jsessionid
,否则服务器将无法通过会话识别您的请求您可以在Java代码中使用^{} :
您需要在JSP文件中执行同样的操作。这通常是通过^{} 之类的方式完成的,而不是直接将URL写入文件: