【JavaEE】【1.3 Servlet】1.3.3 HttpServletRequest的应用

server/2024/10/20 16:38:40/

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
    • ③ HTTP协议版本:如 HTTP/1.1 或 HTTP/2。
  • 请求头部(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:用户登录

  1. 用户操作:用户打开论坛网站,点击“登录”按钮,进入登录页面。
  2. 表单提交:用户在登录页面输入用户名和密码,然后点击“登录”按钮提交表单。此时,用户的浏览器会向服务器发送一个HTTP POST请求,请求中包含用户输入的用户名和密码。
  3. 服务器验证:服务器接收到登录请求后,会从请求中提取出用户名和密码,然后在数据库中查找对应的用户信息。如果找到了匹配的用户,并且密码也验证通过,那么服务器会认为用户登录成功。
  4. 创建会话:登录成功后,服务器会为用户创建一个新的会话(Session)。会话是一个用于存储用户状态信息的对象,它可以在多个请求之间共享数据。在这个例子中,服务器会在会话中存储用户的身份信息,如用户ID、用户名等。
  5. 生成会话ID:为了标识和跟踪用户的会话,服务器会生成一个唯一的会话ID。这个会话ID通常是一个随机生成的字符串,用于在服务器和客户端之间建立关联。
  6. 发送Cookie:服务器会将生成的会话ID作为Cookie的一部分发送给用户的浏览器。Cookie是一个包含少量数据的文本文件,它会被用户的浏览器保存在本地。当用户再次访问该网站时,浏览器会自动将Cookie发送给服务器,以便服务器识别用户的身份和会话状态。

步骤2:用户浏览网站

  1. 用户操作:登录成功后,用户开始浏览论坛的不同页面和帖子。每当用户点击一个链接或提交一个表单时,用户的浏览器都会向服务器发送一个HTTP请求。
  2. 发送Cookie:在发送请求时,用户的浏览器会自动将之前接收到的包含会话ID的Cookie包含在请求头中发送给服务器。这是通过HTTP协议中的Cookie机制实现的。
  3. 解析Cookie:服务器接收到请求后,会解析请求头中的Cookie,从中提取出会话ID。然后,服务器会根据会话ID在内存中查找对应的会话对象。
  4. 获取用户信息:如果找到了对应的会话对象,服务器就可以从会话中获取用户的身份信息。这些信息可以用于为用户呈现个性化的页面内容,如显示用户的用户名、头像等。
  5. 处理请求:服务器根据用户的请求和会话中的用户信息来处理请求。例如,如果用户请求查看某个帖子的内容,服务器会找到该帖子的数据并将其包含在响应中返回给用户。
  6. 发送响应:服务器将处理后的响应发送给用户的浏览器。响应中可能包含HTML页面、CSS样式表、JavaScript脚本等数据。用户的浏览器会解析这些数据并显示在页面上供用户查看。

步骤3:用户退出登录

  1. 用户操作:当用户点击“退出登录”按钮时,浏览器会向服务器发送一个退出登录的请求。
  2. 服务器处理:服务器接收到退出登录的请求后,会销毁与用户会话ID关联的会话对象。这样,用户的登录状态就被清除了。
  3. 清除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请求和响应、管理会话等。

  1. request对象

    • 定义:request对象是javax.servlet.http.HttpServletRequest类的实例,它代表了客户端的请求。每当客户端发送一个HTTP请求到服务器时,服务器就会创建一个新的request对象,并将这个请求封装在这个对象中。
    • 生命周期:request对象的生命周期是短暂的,它仅在当前的HTTP请求中有效。当服务器处理完这个请求并返回响应后,这个request对象就会被销毁。这意味着你不能在一个请求中设置的request属性在另一个请求中访问。
    • 用途:request对象主要用于接收客户端发送的数据(如表单数据、查询参数等),以及获取请求的其他信息(如请求的URL、请求头、请求方法等)。
  2. session对象

    • 定义:session对象是javax.servlet.http.HttpSession类的实例,它用于跟踪用户的会话状态。当用户首次访问支持会话的Web应用时,服务器会为该用户创建一个新的会话,并分配一个唯一的会话ID。这个会话ID通常通过Cookie或URL重写的方式发送到客户端,以便在后续的请求中识别用户。
    • 生命周期:session对象的生命周期从用户首次访问Web应用开始,直到会话结束(如用户关闭浏览器窗口、会话超时、服务器关闭等)。在会话期间,用户发送的所有请求都将共享同一个session对象。因此,你可以在一个请求中设置的session属性在后续的请求中访问。
    • 用途:session对象主要用于保存用户的会话信息,如用户的登录状态、购物车内容等。这些信息在用户与Web应用交互的过程中非常重要。
  3. 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页面

在这里插入图片描述


http://www.ppmy.cn/server/40666.html

相关文章

安卓动态加载view

目录 前言一、addview1.1 addView 的重载方法1.2 在 LinearLayout 中的使用1.2.1 addView(View child)方法的分析&#xff1a;1.2.2 addView(View child, int index)方法的分析&#xff1a;1.2.3 小结 1.3 在 RelativeLayout 中的使用 二、addContentview2.1 测试 12.2 测试 22…

【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteCStoreTable))】

ALTER TABLE&#xff08;ExecRewriteCStoreTable&#xff09; 概述ExecRewriteCStoreTable 函数ATCStoreRewriteTable 函数ATCStoreGetRewriteAttrs 函数ChangeTableSpaceForDeltaRelation 函数ATOnlyCheckCStoreTable 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在…

SpringBoot整合JSR303分组校验

文章目录 JSR303 校验&#xff1a;分组校验 &#xff1a; JSR303 校验&#xff1a; 分组校验 &#xff1a; 首先导入依赖&#xff1a; <!-- JSR303 校验--><dependency><groupId>javax.validation</groupId><artifactId>validatio…

Spring6 的JdbcTemplate的JDBC模板类的详细使用说明

1. Spring6 的JdbcTemplate的JDBC模板类的详细使用说明 文章目录 1. Spring6 的JdbcTemplate的JDBC模板类的详细使用说明每博一文案2. 环境准备3. 数据准备4. 开始4.1 从数据表中插入(添加)数据4.2 从数据表中修改数据4.3 从数据表中删除数据4.4 从数据表中查询一个对象4.5 从数…

Mysql 基础 - 常见 子句

算数运算符 > < > < !/<> 逻辑运算符 3i in is null is not null 2l limit like 2o or 、order by 1a and ib between and 1n not and、or 、not、 in、 orderby、 limit、 like、 between...and、 is null 、is not null

docker 部署SSM项目(包含打包)

一&#xff1a;SSM项目打包 1.这个一定要勾选防止静态资源没打包上 2.第二步 3.第三步 4.更改名字(注意部署到线上的时候这里如果用docker或者window部署的话需要带这个项目名&#xff0c;不然会出现找不到接口的情况) ![在这里插入图片描述](https://img-blog.csdnimg.cn/dir…

Vue.js

1.过渡 Vue 在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的应用过渡效果。 Vue 提供了内置的过渡封装组件&#xff0c;该组件用于包裹要实现过渡效果的组件。 语法格式 <transition name "nameoftransition"> <div></div> <…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么&#xff1f; 三、实战 一、无限…