Http报文结构
请求报文
HTTP的请求报文由四部分组成(请求行+请求头部+空行+请求体):
- 请求行(Request Line)①②③ :
- ① 请求方法(Method):要执行的HTTP操作,如GET、POST、PUT、DELETE等。
- GET方法通常用于请求指定资源,POST方法用于提交表单数据。
- ② 请求的URL(Uniform Resource Locator):指定了要访问的Web资源的位置。
- 与报文头的Host属性组成完整的请求URL,比如在上面的例子中完整URL地址为应为
localhost:8088/chapter17/user.html
- 与报文头的Host属性组成完整的请求URL,比如在上面的例子中完整URL地址为应为
- ③ HTTP协议版本:如 HTTP/1.1 或 HTTP/2。
- ① 请求方法(Method):要执行的HTTP操作,如GET、POST、PUT、DELETE等。
- 请求头部(Request Headers)④:包含了关于该请求的各种元信息。这些头部字段为服务器提供了关于客户端环境、请求的属性以及客户端期望接收到的响应类型等信息。请求头部包含多个字段,每个字段都由一个字段名和一个对应的值组成,字段名和值之间用冒号(:)分隔,字段之间用回车符和换行符(\r\n)分隔。
- 空行:空行只包含一个回车符和一个换行符(\r\n),用于分隔请求头和请求体,表示请求头的结束。
- 请求体(Request Body)⑤ :请求体是可选的,它包含要发送到服务器的数据。例如,当使用POST方法提交表单时,表单数据会包含在请求体中。如果使用POST方法提交一个包含用户名和密码的表单,请求体可能为:
username=Alice&password=secret
常见请求头字段
Host:
指定请求的资源所在的主机名和端口号。这是HTTP/1.1协议中强制要求的一个头部字段。
示例:Host: www.example.com
User-Agent:
标识发出请求的客户端软件类型、操作系统、软件开发商以及版本号等信息。
示例:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept:
告知服务器客户端能够处理的媒体类型(MIME类型),如文本、图片、视频、音频等。
示例:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:
客户端支持的压缩编码类型,如gzip、deflate等。
示例:Accept-Encoding: gzip, deflate, br
Accept-Language:
客户端支持的自然语言种类。
示例:Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection:
指定连接类型。常见的值有keep-alive(保持连接)和close(关闭连接)。
示例:Connection: keep-alive
Referer:
标识发出请求的页面URL。它通常用于分析用户从哪里来、防止图片盗链等。
示例:Referer: http://www.example.com/previous-page.html
Cookie:
由服务器发送并在客户端存储的数据片段,每次请求时都会发送给服务器。它通常用于保持用户的会话状态。
示例:Cookie: session_id=1234567890abcdef; user_name=JohnDoe
Content-Type:
当请求包含实体主体时,该字段用于指示主体中数据的媒体类型。对于POST和PUT请求,它特别重要,因为它描述了发送到服务器的数据的格式。
示例(对于表单数据):Content-Type: application/x-www-form-urlencoded
示例(对于JSON数据):Content-Type: application/json
Content-Length:
表示请求主体的长度(以字节为单位)。当请求中包含主体时,这个头部字段是必要的。
示例:Content-Length: 15
Authorization:
包含了用户认证信息,通常在需要验证用户身份时使用,如使用基本认证或令牌认证。
示例(使用基本认证):Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control:
用于指定缓存指令,如请求是否可以被缓存、缓存多久等。
示例:Cache-Control: no-cache
If-Modified-Since:
如果客户端之前已经缓存了某个资源,并且希望获取自指定日期以来被修改的资源,则可以使用这个字段。
示例:If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
会话技术
会话技术的主要作用是在Web应用程序中管理和维护用户与服务器之间的交互状态 。它允许服务器跟踪用户的身份、行为、偏好等信息,并在用户的不同请求之间共享这些数据,从而提供个性化的用户体验和增强应用程序的功能。
会话技术的实现主要依赖于以下两种方式:
- 客户端会话技术:主要通过Cookie来实现。当服务器需要为用户保存会话状态时,会在HTTP响应中向客户端发送一个包含会话信息的Cookie。这个Cookie通常包含会话标识符(Session ID),用于唯一标识用户的会话。客户端浏览器会将这个Cookie保存在本地,并在后续的请求中自动将其发送给服务器。服务器收到请求后,通过解析Cookie中的会话标识符来恢复用户的会话状态。
- 服务器端会话技术:主要通过Session来实现。当服务器需要为用户保存会话状态时,会在服务器端创建一个与用户会话相关的Session对象,并将用户的会话信息保存在该对象中。服务器为每个用户分配一个唯一的会话标识符(Session ID),并将其发送给客户端浏览器。客户端浏览器会将这个会话标识符保存在Cookie中,并在后续的请求中将其发送给服务器。服务器收到请求后,通过解析Cookie中的会话标识符来找到对应的Session对象,从而获取用户的会话信息。
举例
场景
假设你访问了一个需要登录的论坛网站,你首先需要进行登录,然后浏览不同的帖子和页面。
步骤1:用户登录
- 用户操作:用户打开论坛网站,点击"登录"按钮,进入登录页面。
- 表单提交:用户在登录页面输入用户名和密码,然后点击"登录"按钮提交表单。此时,用户的浏览器会向服务器发送一个HTTP POST请求,请求中包含用户输入的用户名和密码。
- 服务器验证:服务器接收到登录请求后,会从请求中提取出用户名和密码,然后在数据库中查找对应的用户信息。如果找到了匹配的用户,并且密码也验证通过,那么服务器会认为用户登录成功。
- 创建会话:登录成功后,服务器会为用户创建一个新的会话(Session)。会话是一个用于存储用户状态信息的对象,它可以在多个请求之间共享数据。在这个例子中,服务器会在会话中存储用户的身份信息,如用户ID、用户名等。
- 生成会话ID:为了标识和跟踪用户的会话,服务器会生成一个唯一的会话ID。这个会话ID通常是一个随机生成的字符串,用于在服务器和客户端之间建立关联。
- 发送Cookie:服务器会将生成的会话ID作为Cookie的一部分发送给用户的浏览器。Cookie是一个包含少量数据的文本文件,它会被用户的浏览器保存在本地。当用户再次访问该网站时,浏览器会自动将Cookie发送给服务器,以便服务器识别用户的身份和会话状态。
步骤2:用户浏览网站
- 用户操作:登录成功后,用户开始浏览论坛的不同页面和帖子。每当用户点击一个链接或提交一个表单时,用户的浏览器都会向服务器发送一个HTTP请求。
- 发送Cookie:在发送请求时,用户的浏览器会自动将之前接收到的包含会话ID的Cookie包含在请求头中发送给服务器。这是通过HTTP协议中的Cookie机制实现的。
- 解析Cookie:服务器接收到请求后,会解析请求头中的Cookie,从中提取出会话ID。然后,服务器会根据会话ID在内存中查找对应的会话对象。
- 获取用户信息:如果找到了对应的会话对象,服务器就可以从会话中获取用户的身份信息。这些信息可以用于为用户呈现个性化的页面内容,如显示用户的用户名、头像等。
- 处理请求:服务器根据用户的请求和会话中的用户信息来处理请求。例如,如果用户请求查看某个帖子的内容,服务器会找到该帖子的数据并将其包含在响应中返回给用户。
- 发送响应:服务器将处理后的响应发送给用户的浏览器。响应中可能包含HTML页面、CSS样式表、JavaScript脚本等数据。用户的浏览器会解析这些数据并显示在页面上供用户查看。
步骤3:用户退出登录
- 用户操作:当用户点击"退出登录"按钮时,浏览器会向服务器发送一个退出登录的请求。
- 服务器处理:服务器接收到退出登录的请求后,会销毁与用户会话ID关联的会话对象。这样,用户的登录状态就被清除了。
- 清除Cookie:为了确保用户下次访问时需要重新登录,服务器还会通知用户的浏览器删除之前发送的包含会话ID的Cookie。这通常是通过在响应头中设置Set-Cookie字段来实现的,该字段的值会告诉浏览器删除指定的Cookie。
HttpServletRequest
HttpServletRequest的方法
⑤ setAttribute
该方法的主要作用是:在当前 HTTP 请求的生命周期内,在同一请求的不同部分(例如,在请求处理过程中调用的其他 Servlet、JSP 页面或过滤器)之间共享数据。
例如,在 Servlet 中处理完请求后,你可能需要将一些数据传递给 JSP 页面进行显示。你可以使用 setAttribute 方法将数据存储在当前请求的范围内,然后在 JSP 页面中获取并使用这些数据。
// 在 Servlet 中
request.setAttribute("message", "Hello, World!");
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/view/success.jsp");
dispatcher.forward(request, response);
// 在 JSP 页面中
${message} <!-- 将显示 "Hello, World!" -->
JSP中的三个内置对象:request、session和application
JSP中的内置对象,也称为隐式对象或预定义对象,是JSP容器为开发者提供的可以直接在JSP页面中使用,而无需显式声明和实例化的对象。这些对象使得JSP页面能够方便地访问各种作用域的数据、处理HTTP请求和响应、管理会话等。
-
request对象
- 定义:request对象是javax.servlet.http.HttpServletRequest类的实例,它代表了客户端的请求。每当客户端发送一个HTTP请求到服务器时,服务器就会创建一个新的request对象,并将这个请求封装在这个对象中。
- 生命周期:request对象的生命周期是短暂的,它仅在当前的HTTP请求中有效。当服务器处理完这个请求并返回响应后,这个request对象就会被销毁。这意味着你不能在一个请求中设置的request属性在另一个请求中访问。
- 用途:request对象主要用于接收客户端发送的数据(如表单数据、查询参数等),以及获取请求的其他信息(如请求的URL、请求头、请求方法等)。
-
session对象
- 定义:session对象是javax.servlet.http.HttpSession类的实例,它用于跟踪用户的会话状态。当用户首次访问支持会话的Web应用时,服务器会为该用户创建一个新的会话,并分配一个唯一的会话ID。这个会话ID通常通过Cookie或URL重写的方式发送到客户端,以便在后续的请求中识别用户。
- 生命周期:session对象的生命周期从用户首次访问Web应用开始,直到会话结束(如用户关闭浏览器窗口、会话超时、服务器关闭等)。在会话期间,用户发送的所有请求都将共享同一个session对象。因此,你可以在一个请求中设置的session属性在后续的请求中访问。
- 用途:session对象主要用于保存用户的会话信息,如用户的登录状态、购物车内容等。这些信息在用户与Web应用交互的过程中非常重要。
-
application对象
- 定义:application对象是javax.servlet.ServletContext类的实例,它代表了整个Web应用。每个Web应用只有一个application对象,它在Web应用启动时创建,并在Web应用关闭时销毁。
- 生命周期:application对象的生命周期是整个Web应用的生命周期。它在Web应用启动时创建,并在Web应用关闭时销毁。这意味着你可以在application对象中存储一些需要在整个Web应用中共享的数据。
- 用途:application对象主要用于存储Web应用的全局信息,如应用的配置信息、数据库连接池等。这些信息在整个Web应用中都是共享的。
总结
- request对象的生命周期是短暂的,它仅在当前的HTTP请求中有效。
- session对象的生命周期是从用户首次访问Web应用开始,直到会话结束。
- application对象的生命周期是整个Web应用的生命周期。
从Servlet跳转到JSP页面
