关于java web session handeling如何工作的困惑.使用servlet api和HttpSession对象揭开Cookie和标头差异的神秘面纱

Hor*_*ice 5 java spring jsp servlets spring-mvc

我正在学习Spring安全性和Spring MVC,但我意识到我需要首先学习jsp Servlets并在java环境中学习一般的Web编程.

我有关于HttpServletRequest和HttpServletResponse对象的混淆,以及它们如何用于向请求和响应对象添加标头以及它们与会话的关系.

据我所知,cookie是一种类型的标题,就像Content-type和Accept一样.java servlet api通过使用特定于使用标头的上下文的方法,可以很容易地使用标头.例如:

response.setContentType(String mimeType)
response.setContentLength(int lengthInBytes)
Run Code Online (Sandbox Code Playgroud)

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

response.addCookie(Cookie cookie)
response.getCookies()
Run Code Online (Sandbox Code Playgroud)

由于cookie是一种标题,我不能只使用这样的东西:

String cookieVal = response.getHeader("cookie")
Run Code Online (Sandbox Code Playgroud)

我很难理解会话管理以及它与HttpServletRequest和HttpServletResponse API的关系.什么是HttpSession对象?

HttpSession.getAttribute() // What is this getting??
HttpSession.setAttribute("Bla Bla", "valuetoset") // What is this setting?
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 12

您可以阅读描述Cookie和相关标头Set-CookieCookieRFC,了解它们是什么.

如果您想详细了解Cookie和会话的相关性,可以查看规范的第7章Servlet.

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

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

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)方法来管理状态.

  • @TazMan 不。会话属性与“Cookie”无关。属性在服务器端存储和管理。它们永远不会在标头中返回给客户端。这就是服务器管理状态的方式。 (2认同)