Servlet复习
Servlet
是一种在 Java EE环境中运行的服务器端 Java 程序,用于处理客户端请求并生成动态响应。
它们通常用于构建 Web 应用程序,是 Java Web 技术的核心部分。
1. 基本概念
-
定义: Servlet 是一个实现了
javax.servlet.Servlet
接口的 Java 类,能够接收和处理来自客户端(通常是浏览器)的请求,并返回相应的结果。 -
工作机制: 当客户端发送请求到服务器时,Web 服务器会将该请求转发给相应的 Servlet 进行处理。Servlet 处理完请求后,可以生成 HTML、JSON 或其他类型的数据返回给客户端。
2. 主要功能
-
处理 HTTP 请求: Servlet 能够处理各种类型的 HTTP 请求,包括
GET
和POST
。 -
生成动态内容: 根据请求参数或数据库中的数据,Servlet 可以动态生成不同的响应内容。
-
会话管理: Servlet 可以通过 HTTP 会话跟踪用户状态,使其能够处理用户登录、购物车等功能。
3. 生命周期
Servlet 的生命周期由以下几个阶段组成:
-
加载和实例化: Servlet 容器启动时会加载 Servlet 类,并创建其实例。
-
初始化: Servlet 容器调用
init()
方法进行初始化,通常在这里进行资源的准备工作,如数据库连接。 -
请求处理: 每当有请求到达时,Servlet 容器会调用
service()
方法,根据请求类型(如doGet()
或doPost()
)处理请求。 -
销毁: 当 Servlet 容器决定卸载 Servlet 时,会调用
destroy()
方法,进行清理工作。
4.service()
方法
在 Java Servlet 中用于处理客户端的请求。它是 HttpServlet
类中的一个核心方法,通常被重写以实现自定义的请求处理逻辑。具体来说,service()
方法的主要作用包括:
-
请求分发:根据请求的 HTTP 方法(如
GET
、POST
、PUT
、DELETE
等)来决定调用哪个具体的处理方法,例如doGet()
、doPost()
等。 -
统一入口:
service()
方法可以作为请求的统一入口点,允许开发者在这里实现公共的逻辑,比如认证、日志记录、请求参数解析等。 -
响应处理:在
service()
方法中,可以设置响应的内容类型和其他响应头信息,并向客户端返回数据。
工作流程
- 当一个请求到达 Servlet 容器时,容器会调用该 Servlet 的
service()
方法。 service()
方法内部会判断请求的 HTTP 方法,并根据不同的方法调用相应的处理逻辑。- 处理完成后,
service()
方法会将结果返回给客户端。
重写service,传参传值,然后通过判断对比确定是哪一种请求处理
虽然通常推荐直接重写 doGet()
和 doPost()
方法,但如果需要实现更复杂的逻辑,重写 service()
方法是一个有效的方式。例如,可以在 service()
方法中添加日志记录、权限验证等逻辑,然后再将请求分发到具体的处理方法。重写 service()
方法,以实现对不同 HTTP 请求方法(如 GET
和 POST
)的处理。
-
@WebServlet注解: 使用
@WebServlet
注解定义了这个 Servlet 的 URL 映射,这里是/customService
。 -
重写
service()
方法:- 在
service()
方法中,首先获取当前请求的方法类型。 - 根据请求的方法类型(
GET
或POST
),调用相应的处理方法doGet()
或doPost()
。 - 如果请求方法不是
GET
或POST
,则向客户端返回 HTTP 405 状态码,表示该方法不被允许。
- 在
-
处理 GET 请求 (
doGet()
):- 在
doGet()
方法中,设置响应内容类型为 HTML,并向客户端输出简单的 HTML 内容。
- 在
-
处理 POST 请求 (
doPost()
):- 在
doPost()
方法中,同样设置响应内容类型为 HTML,并向客户端输出简单的 HTML 内容
- 在
过滤器(Filter)和监听器(Listener)
过滤器(Filter)和监听器(Listener)在Java EE中都是自动执行的,它们的生命周期由Servlet容器管理。
过滤器(Filter)
自动执行机制:
- 过滤器会在Servlet处理请求之前和之后自动执行。
- 当用户发起请求时,Servlet容器会根据配置的URL模式找到相应的过滤器,并按照定义的顺序执行它们的
doFilter
方法。
生命周期:
- 创建:当应用程序启动时,容器会加载所有的过滤器。
- 初始化:调用
init()
方法进行初始化。 - 过滤请求:每当接收到请求时,调用
doFilter()
方法。 - 销毁:当应用程序关闭时,调用
destroy()
方法进行清理。
过滤器(Filter)
定义:过滤器是一种用于对请求和响应进行处理的对象。在Servlet处理请求之前或之后,可以通过过滤器进行一些特定的操作。
功能:
- 请求预处理:可以在请求到达Servlet之前进行验证、记录日志等。
- 响应后处理:可以对响应内容进行修改,例如压缩响应数据。
- 链式过滤:多个过滤器可以链接在一起,形成一个过滤器链。
使用场景:
- 身份验证和授权
- 日志记录
- 数据压缩
- 输入数据的预处理
例子:过滤器设置(统一)编码
- 注解@WebFilter:指定过滤器的URL模式,这里使用"/*"表示过滤所有请求。
- init()方法:用于初始化过滤器,可以在这里进行一次性设置。
- doFilter()方法:核心处理逻辑:
request.setCharacterEncoding("UTF-8")
:设置请求的字符编码为UTF-8。httpResponse.setContentType("text/html;charset=UTF-8")
:设置响应的内容类型和字符编码。chain.doFilter(request, response)
:调用链中的下一个过滤器或目标Servlet。
- destroy()方法:用于清理资源,可以在这里释放资源等。
使用注意事项
- 确保在请求处理的最开始就设置编码,以避免出现编码问题。
- 根据具体需求修改字符编码,比如可以使用"UTF-8"或者其他编码。
- 如果项目中有多个过滤器,请考虑它们的执行顺序,以确保编码设置正常工作。
通过这样的过滤器,您可以有效地管理Web应用中的字符编码,避免因编码不一致而导致的问题
监听器(Listener)
定义:监听器是一种用于监听特定事件的对象,它可以对Web应用程序的生命周期事件、会话事件等进行响应。
自动执行机制:
- 监听器会在特定事件发生时自动执行,例如应用程序启动、会话创建等。
- Servlet容器会监控这些事件并调用相应的监听器方法。
-
监控应用程序的状态:例如,监听应用程序启动、销毁、会话创建和销毁等事件。
- 处理资源管理:可以在应用程序启动时初始化资源,在结束时释放资源。
生命周期:
- 创建:当应用程序启动时,容器会加载所有的监听器。
- 初始化:对于
ServletContextListener
,调用contextInitialized()
方法;对于HttpSessionListener
,调用sessionCreated()
方法等。 - 响应事件:当特定事件发生时,例如用户会话创建或销毁,调用对应的方法(如
sessionDestroyed()
)。 - 销毁:当应用程序关闭时,调用
contextDestroyed()
方法。
使用场景:
- 监听应用程序启动和关闭
- 监听用户会话的创建和销毁
- 监听属性变化
这两种组件都通过自动执行的方法来增强Web应用的功能,开发者只需实现必要的方法,Servlet容器会负责调用它们。
-
小结
- 过滤器用于对请求和响应进行处理,是与请求的生命周期紧密关联的。
- 监听器用于监控和响应特定的事件,帮助管理应用程序的状态和资源。
- 过滤器:用于在请求处理过程中根据条件决定是否执行特定逻辑,比如请求日志记录。
- 监听器:用于监控应用程序的特定事件,比如会话创建和销毁,并可以在这些事件发生时执行逻辑。
Post请求和Get请求
在 web 开发中,GET
和 POST
请求是 HTTP 协议中最常用的两种请求方法。
主要涉及数据传输方式、可见性、以及对服务器资源的影响。
1. GET 请求
-
定义:
GET
请求用于从服务器获取数据。请求的数据会附加在 URL 后面,以查询字符串的形式发送。 -
特性:
- 安全性:
GET
请求是安全的,不会更改服务器上的资源。 - 幂等性: 多次请求相同的 URL 会返回相同的结果。
- 数据长度限制: URL 的长度有限制,通常最大为 2048 字符(具体取决于浏览器和服务器)。
- 缓存:
GET
请求可以被缓存,浏览器可以保存以前的请求和响应。 -
数据可见性:
- 数据通过 URL 传递,任何人都可以在浏览器的地址栏、网络日志或代理服务器上看到这些数据。这意味着敏感信息(如密码、信用卡号)不应该通过
GET
请求发送。
- 数据通过 URL 传递,任何人都可以在浏览器的地址栏、网络日志或代理服务器上看到这些数据。这意味着敏感信息(如密码、信用卡号)不应该通过
-
缓存与重放攻击:
GET
请求可能被缓存,重放攻击者可以利用缓存的结果多次发送相同请求,从而可能导致意外的后果。
-
URL 长度限制:
- 由于 URL 长度有限,无法传递大量数据,这种限制在某些情况下可能会带来问题。
- 安全性:
-
示例:
GET /search?q=example HTTP/1.1 Host: www.example.com
2. POST 请求
-
定义:
POST
请求用于向服务器发送数据,通常用于提交表单或上传文件。 -
特性:
- 安全性:
POST
请求不是安全的,可能会更改服务器上的资源。 - 非幂等性: 多次发送相同的
POST
请求可能会导致不同的结果(例如,多次提交表单)。 - 数据长度限制:
POST
请求没有严格的大小限制,适合传输大量数据。 - 不易缓存: 浏览器一般不会缓存
POST
请求。 -
数据可见性:
- 数据在请求体中传递,不会直接显示在 URL 中,因此相对于
GET
请求,敏感数据的可见性较低。然而,仍需注意,数据在传输过程中可以被截获,尤其是在未加密的连接上。
- 数据在请求体中传递,不会直接显示在 URL 中,因此相对于
-
不易缓存:
POST
请求通常不会被缓存,这减少了重放攻击的风险。
-
非幂等性:
- 因为
POST
请求可能修改服务器数据,重复发送同一POST
请求可能导致多次创建记录或状态改变。因此,开发者需要特别注意处理重复请求的安全性。
- 因为
-
适合传输较大数据:
POST
请求没有严格的大小限制,可以传输更大量的数据,适合文件上传等场景。
- 安全性:
-
示例:
POST /submit HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded name=John&age=30
适用场景
-
使用 GET 请求:
- 获取数据:如查询、搜索。
- 生成书签:因 URL 中包含参数。
- 可被缓存的请求。
-
使用 POST 请求:
- 提交表单:如注册、登录。
- 上传文件。
- 需修改服务器状态的操作。
安全最佳实践
无论使用 GET
还是 POST
请求,都应遵循以下安全最佳实践:
-
使用 HTTPS: 确保所有数据传输都通过 HTTPS 加密,以防止中间人攻击和数据窃取。
-
验证与授权: 对所有请求进行适当的身份验证和授权检查,确保用户只能访问他们有权访问的资源。
-
输入验证与清理: 对所有输入数据进行验证和清理,以防止注入攻击(如 SQL 注入、XSS)。
-
CSRF 保护: 在
POST
请求中使用 CSRF 令牌,防止跨站请求伪造攻击。 -
限制数据量: 尽量限制请求中发送的数据量,避免过大的请求影响性能。
总结
- GET 请求适合获取数据,但在传输敏感信息时不够安全。
- POST 请求更适合发送数据,尤其是敏感信息,但也要做好相应的安全措施。。
选择合适的请求方式以及实施必要的安全措施是确保 Web 应用安全的关键。