关于Java Web会话处理如何工作的困惑。使用servlet API和HttpSession对象使Cookies和标头的差异变得神秘


问题内容

我正在学习Spring安全性和Spring MVC,但是我意识到我需要首先学习jsp Servlet和Java环境中的常规Web编程。

我对HttpServletRequest和HttpServletResponse对象以及如何使用它们向请求和响应对象添加标头以及它们与会话的关系感到困惑。

据我了解,Cookie就像Content-type和Accept一样是一种标头。通过使用特定于使用标头的上下文的方法,java servlet
api使得使用标头变得容易。例如:

response.setContentType(String mimeType)
response.setContentLength(int lengthInBytes)

我的困惑从这里开始。Cookie不是String或int,它是一个对象:

response.addCookie(Cookie cookie)
response.getCookies()

由于cookie是标头的一种,因此我不能只使用以下内容:

String cookieVal = response.getHeader("cookie")

我很难理解会话管理及其与HttpServletRequest和HttpServletResponse API的关系。HttpSession对象的作用是什么?

HttpSession.getAttribute() // What is this getting??
HttpSession.setAttribute("Bla Bla", "valuetoset") // What is this setting?

问题答案:

您可以阅读描述Cookies和相关标头Set- Cookie``CookieRFC,了解它们是什么。

你可以通过在第7章Servlet规格,如果你想详细了解如何cookie和session有关系。

您首先需要了解HTTP是无状态协议。这意味着客户端发出的每个请求都与任何先前或将来的请求无关。但是,作为用户,我们非常希望在与Web应用程序交互时具有某种状态。例如,银行应用程序只希望您能够查看和管理交易。音乐流媒体网站可能希望根据您已经听到的内容推荐一些好的节奏。

为此,引入CookieSession概念。Cookies是键值对,但具有特定格式(请参阅链接)。会话是服务器端实体,用于存储跨越服务器和客户端之间的多个请求/响应的信息(在内存中或持久存储)。

ServletHTTP会话使用与名字的cookie JSESSIONID和值标识会话。

Servlet容器保持的地图(YMMV)HttpSession对象和这些标识符。当客户端第一次发出请求时,服务器会创建一个HttpSession具有唯一标识符的对象,并将其存储在其映射中。然后Set- Cookie在响应中添加标题。它将cookie的名称设置为,JSESSIONID并将其值设置为刚创建的标识符。

这是服务器使用的最基本的Cookie。您可以根据需要设置任意数量的信息。该ServletAPI使用该HttpServletResponse#addCookie(Cookie)方法为您简化了操作,但是您可以使用该HttpServletResponse#addHeader(String, String)方法自己完成操作。

客户端接收这些cookie,并将其存储在某个地方,通常存储在文本文件中。向服务器发送新请求时,它可以使用请求Cookie标头中的cookie
来通知服务器它可能已经完成了上一个请求。

Servlet容器收到请求时,它将提取Cookie标头值,并尝试HttpSession使用JSESSIONIDcookie中的键从其映射中检索对象。这HttpSession则物体被连接到HttpServletRequest该对象Servlet容器创建并传递给你的Servlet。您可以使用setAttribute(String, Object)getAttribute(String)方法来管理状态。