什么是Servlet?
它是一个 Java 类,用于扩展托管通过请求-响应编程模型访问的应用程序的服务器的功能。
Java Servlet 技术定义了特定于 HTTP 的 servlet 类。 javax.servlet 和 javax.servlet.http 包提供了用
于编写 servlet 的接口和类。 “javax.servlet”包中的 Servlet 声明了 servlet 生命周期的三个基本方法——init()、service() 和 destroy()。
什么是Servlet容器?
Servlet 在处理网络端(例如解析 HTTP 请求、连接处理等)的 servlet 容器中运行。 Tomcat 是最受欢迎的。
Filter
它是一个 Java 类,由 servlet 容器针对每个传入的 HTTP 请求和每个 HTTP 响应执行。
在到达 Servlet 之前,请求总是首先通过 Filter 实例。
如果您的应用程序中有多个自定义过滤器,则可以使用“@Order”注释定义顺序。
- init(FilterConfig config) — 仅调用一次。它用于初始化过滤器。
- doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain) — 每次用户向过滤器映射到的任何资源发送请求时都会调用此方法。它用于执行过滤任务。
- destroy() - 当过滤器从服务中取出时,它只被调用一次。
Interceptor
Spring 拦截器类似于 Servlet 过滤器。拦截器只允许自定义预处理,可以选择禁止处理程序本身的执行,以及自定义后处理,可以访问 Spring 上下文。 preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) — 这用于在将请求发送到控制器之前执行操作。此方法应返回 true 以将响应返回给客户端。
- postHandle(HttpServletRequest 请求,HttpServletResponse 响应,对象处理程序,ModelAndView modelAndView) — 这用于在向客户端发送响应之前执行操作。
- afterCompletion(HttpServletRequest 请求,HttpServletResponse 响应,
- Object handler, Exception exception) — 这用于在完成请求和响应后执行操作。
HandlerInterceptor :
HandlerInterceptor 实例作为 DispatcherServlet(实现 javax.servlet.Servlet)内部请求处理的一部分执行。
HandlerInterceptorAdapter:
如果你想提供一个自定义实现并且只关心他们的几个方法(如果你不想创建需要覆盖的空方法),最好实现一个适配器。
Filters vs HandlerInterceptors
- Filter 与 Servlet API 有关,而 HandlerIntercepter 是 Spring 特定的概念。
- 拦截器只会在过滤器之后执行。
- 细粒度的预处理任务适用于HandlerInterceptor(授权检查等)
- 内容处理相关或通用流程非常适合过滤器(例如多部分表单、zip 压缩、图像处理、日志记录请求、身份验证等)
- Interceptor 的 postHandle 方法将允许您向视图添加更多模型对象,但您不能更改 HttpServletResponse,因为它已经提交。
- Filter 的 doFilter 方法比 Interceptor 的 postHandle 更加通用。 您可以更改请求或响应并将其传递给链,甚至阻止请求处理。
- HandlerInterceptor 提供了比过滤器更细粒度的控制,因为您可以访问实际的目标“处理程序”。 您甚至可以检查处理程序方法是否具有特定注释。
Spring Cloud Gateway 自定义过滤器
GlobalFilter
全局过滤器影响每个请求。
GatewayFilter
网关过滤器仅适用于某些路由。
Order: 如果我们想配置过滤器在过滤器链中的位置,我们可以检索一个 OrderedGatewayFilter 实例。