5

我正在学习 Spring 安全性和 Spring MVC,但我意识到我需要先学习 jsp Servlets 和 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?
4

4 回答 4

13

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

如果您想详细了解 Cookie 和 Session 之间的关系,可以阅读规范的第 7 章。Servlet

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

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

ServletHTTP 会话使用带有名称JSESSIONID和标识会话的值的cookie。

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

这是服务器使用的最基本的 Cookie。您可以使用所需的任何信息设置任意数量的它们。ServletAPI 使您使用该方法变得更简单,但HttpServletResponse#addCookie(Cookie)您可以使用该HttpServletResponse#addHeader(String, String)方法自己完成。

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

Servlet容器接收到请求时,它会提取Cookie标头值并尝试使用cookieHttpSession中的键从其映射中检索对象。JSESSIONID然后将该对象HttpSession附加到容器创建并传递给您的. 您可以使用和方法来管理状态。HttpServletRequestServletServletsetAttribute(String, Object)getAttribute(String)

于 2013-11-11T00:21:34.113 回答
2

您是正确的,cookie 是使用标头管理的。有两个 cookie 管理相关的标头:CookieSet-Cookie

Cookie标头由用户代理(浏览器)发送,将在您的HttpServletRequest对象中可用,并且当您使用诸如.Set-CookieHttpServletResponseaddCookie(Cookie)

在 Java 中,当第一个请求到达您的应用程序时,就会建立一个 HttpSession。您的容器(Jetty、Tomcat、WebSphere 等)中的 Servlet Spec 实现将创建和管理 HttpSession。浏览器将收到一个 JSESSIONID cookie,它将在未来识别此特定会话。

于 2013-11-11T00:09:25.977 回答
1

同意上面给出的答案,我想得出结论,Cookie 和 Session 是网络世界中的两个不同实体。

曲奇饼

Cookie 代表了一些由服务器生成并存储在客户端(浏览器)上的简短信息。根据 HTTP 机制,浏览器必须将服务器之前发送的所有 cookie(未过期)发送到浏览器。

会议

HTTP 是一种无状态协议。与 FTP 和其他协议不同,在多个请求-响应事务之间保留连接状态,在 HTTP 中,为一个请求建立连接,并在满足该请求的响应时关闭。HTTP 中存在这个缺陷,因为它在早期被设计为仅提供静态网页。但是随着网络的扩展,它现在被用于提供动态的成熟网络应用程序。因此,有必要识别用户。因此,对于网络服务器服务的每个请求,都需要一个标签机制来识别每个请求的用户。请求用户的这种标识(请求是否来自同一用户,同一台机器),使用会话。
只有当 web-server 可以在请求中接收到有关用户的任何信息时,会话才能成功实现。向用户提供此信息的一种方式是 Cookie。其他的是 URL 重写、隐藏字段等。

session.setAttribute() 将在服务器端而不是客户端(浏览器)的当前会话中存储信息。

希望它可以帮助你。

于 2015-11-04T09:37:59.043 回答
0

好的 看起来您想了解 Cookie 和标头之间的区别。他们有不同的目的。Cookies是客户端信息的临时存储。服务器在响应中设置 cookie(数据),一旦设置浏览器,就会在每个后续请求中发送这些 cookie(数据),直到 cookie 过期。但是标头用作浏览器和服务器的提示。例如

setHeader("Content-Type", "application/json");

将通知客户端准备在有效负载中查看 json 响应。由于它是“一次性”信息,因此浏览器不需要将这些信息与每个新请求(如 cookie)一起发送回服务器。

于 2016-07-11T00:50:07.783 回答