我们说的 Filter 和 Interceptor 是啥?
- Filter:javax.servlet.Filter
- Interceptor:org.springframework.web.servlet.HandlerInterceptor
参考:
简介
Filter
public interface Filter { public void init(FilterConfig filterConfig) throws ServletException; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException; public void destroy(); }
根据代码附属的文档:
Filter 用于过滤对资源的请求和响应。一个Filter可以同时用于过滤请求和响应。
目标资源可以是 Servlet 或 静态资源。
Filter 的 doFilter 方法执行具体的过滤操作。
Filter 可以通过 FilterConfig 对象获取初始化参数。还可通过 FilterConfig 提供的 ServletContext 引用获取更多资源信息用于过滤操作。
可通过 web descriptor 文件 web.xml 配置Filter,也可以用 @WebFilter 注解配置。
(标准的默认 web descriptor 文件是 WEB-INF/web.xml)
典型使用场景:
- 身份验证
- 日志、审计
- 图像转换
- 数据压缩
- 加解密
- 访问令牌处理
- 触发资源访问事件2
- XSL 转换(XSL/T)
- Mime 类型链式过滤
HandlerInterceptor
public interface HandlerInterceptor { boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
根据代码附属文档:
HandlerInterceptor 用于自定义执行链。
HandlerInterceptor 会在相应的 HandlerAdaptor 被调用前执行,所以可用于“预处理”。
例:授权检查、区域设置、主题更改 等。
它的主要目的就是提取出可复用的 Handler 代码。
作为Spring中的概念,HandlerInterceptor 可以像一般的Bean那样配置在 Application Context 中。
HandlerInterceptor 与 Servlet Filter 很相似。
但是 Interceptor 只允许通过预处理禁止 Handler 本身运行,或执行一些后续处理(post-processing)。
Filter 更强大。如,允许交换传递给后续处理链的 request 和 response 对象。
基本准则:
- 细粒度的 Handler相关 预处理操作 可以用 HandlerInterceptor 实现。
尤其是 授权检查 和 公用的 Handler 代码。 - Filter 适合用于处理 request 和 view 内容。如,Multipart 表单、Gzip压缩。
典型的作法就是处理特定的 Content-Type。
对比
最本质的区别是,Filter 是 Servlet 中的概念,HandlerInterceptor 是 Spring Web 中的概念。
它们是两个不同体系中的概念。因为它们都能实现对 HTTP Request 和 Response 的一些自定义处理,所以会被一些无聊的人强行拿来作比较,甚至成为考题。
其实在一些常见业务常见中,两种技术实现方式并不存在孰优孰劣。只有结合具体业务场景,才能真正比较出哪种方式更合适。
Filter 相关流程
HandlerInterceptor 相关流程
现在的编程模式都是 遇到 新型 业务需求时先搜索一下别人是如何实现的。
我认为这是最普遍、性价比最高、几乎每个人都默认使用、对个人自身成长提升最快的模式。
注意我的用词“新型”。没有人天生就会;自己埋头苦研,不借助巨人力量的,都是傻子;而且肯定不会得到值得推广的成功。编程就是“抄”!
只要清楚它们在 HTTP Request Response 流程中的角色,看到别人给的常规实现方式,就自然会明白 为什么选其中一种而不选另一种。
示例:HandlerInterceptor 用于授权检查
每个项目可能有自己独特的授权检查需求。此示例仅供参考。
很多项目会用Session来存放用户信息(Session可能存储在Redis等中间件中,以实现分布式架构)
RequestContext:存储用户信息的帮助类
此处使用 ThreadLocal 存储的用户信息,不用担心OOM。因为:
- 我们会在后续的HandlerInterceptor中清理用户信息
- 即使清理时遇到异常,线程中的用户信息也不会无限增长。
线程接到下一次用户请求时相关信息又会被设置为新请求的数据
public abstract class RequestContext { private static final ThreadLocal userIdHolder = new ThreadLocal(); // 可根据需要添加各种用户信息字段 public static String getUserId() { return userIdHolder.get(); } public static void setUserId(String id) { userIdHolder.set(id); } public static void clear() { userIdHolder.remove(); } }
AuthInterceptor:执行授权检查
public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) { // 从 response 获取用户相关标识,并进行授权检查 ... // 通过授权检查,并获得 User ID。如果未通过,可设置response相关内容,并返回 false String userId = ... // 保存用户信息,供后续 Controller 业务使用 RequestContext.setUserId(userId); } @Override public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { // 清除之前保存的用户信息。 // 为什么在 afterCompletion() 方法中清理,而不是在 postHandle() 中? // 因为如果业务代码中抛出异常,将跳过 postHandle() 方法,但不会跳过 afterCompletion(). // 详见 DispatcherServlet.doDispatch() 方法 RequestContext.clear(); } }
应用 AuthInterceptor
@Configuration public class MyWebAppConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .addPathPatterns("/**"); } }
使用Request用户信息
@RestController public class TestController { @GetMapping("test") public void test() { String userId = RequestContext.getUserId(); ... } }
相关推荐
Java WEB 篇九 Java servlet、filter、listener、interceptor 之间的区别和联系?
在Java Web开发领域,特别是使用Struts2框架时,Filter和Interceptor是两个非常重要的概念。它们都是用来拦截请求并执行特定逻辑的机制,但它们之间存在一些关键的区别。 #### 一、Filter概述 **Filter** 是...
- **回调与反射机制**:Filter通过回调函数`doFilter()`执行,而Interceptor基于Java反射机制,这使得Interceptor能够在不修改原始Action代码的情况下,动态地添加或修改行为。 - **配置与集成**:Filter的配置相对...
8. **Filter和Listener**:Java Web应用中的Filter和Listener可以监听和过滤HTTP请求,实现登录验证、性能监控等功能。 9. **安全控制**:Spring Security和Apache Shiro是Java Web安全框架,提供身份验证、授权、...
在Java Web开发中,`Filter`是一个至关重要的组件,它属于`javax.servlet`包,用于在请求被实际处理之前和之后进行预处理和后处理。本教程将详细讲解`Filter`的两个主要功能:字符编码过滤和登录验证。 首先,让...
在Java Web开发中,拦截器(Interceptor)与过滤器(Filter)是两种常见的处理请求和响应的技术。它们虽然都用于在请求处理前后执行某些操作,但其实现机制、应用场景以及作用范围等方面存在较大差异。下面将详细...
10. **Struts2**: Struts2是基于MVC模式的开源Web应用框架,它提供了一种组织应用结构的方式,简化了Java Web开发流程,通过Action、Interceptor和Result等核心概念,实现了业务逻辑和表现层的分离。 这套【从零学...
Interceptor需要实现org.springframework.web.servlet.HandlerInterceptor接口,HandlerInterceptor接口有三个方法:preHandle、postHandle和afterCompletion。preHandle方法用于在业务处理器处理请求之前被调用,...
在Java Web开发中,Servlet、拦截器(Interceptor)和过滤器(Filter)是三个非常重要的概念,它们在处理HTTP请求和响应时起到了关键作用。理解并熟练运用这三者能够帮助开发者实现更高效、更安全的Web应用。 首先...
在Java Web开发中,我们经常会遇到各种各样的模块,这些模块是构建复杂应用程序的基础。"java web开发常用模块源代码"这个主题涵盖了这些模块的核心源代码,为开发者提供了宝贵的参考资料。下面将详细介绍一些常见的...
拦截器(Interceptor)是一种在Java Web开发中广泛使用的可插拔组件设计,它允许开发者在不修改核心处理代码的情况下,对请求和响应进行拦截,提供标准化的服务。这种设计模式能够独立地增强系统的功能,提高代码的...
- Filter或Interceptor:在Java Web中,通常会在请求处理之前使用Filter或Spring MVC的Interceptor进行权限拦截,检查用户是否具备访问资源的权限。 - Spring Security:这是一个强大的安全框架,提供了完善的权限...
7. **拦截器与过滤器**:使用Filter和Interceptor进行请求预处理和后处理,例如登录检查、日志记录、性能监控等。 8. **模板引擎**:学习使用模板引擎来简化视图层的编写,如FreeMarker或Velocity,让开发者可以...
Java Web开发中,Servlet、Filter、Listener和Interceptor这四种组件在处理请求和响应的过程中扮演着不同的角色,它们都是Java EE规范中不可或缺的部分,用于增强应用程序的功能和灵活性。 **1. Servlet** Servlet...
在Web开发中,`filter`、`servlet`、`listener`和`interceptor`都是重要的组件,它们各自承担着不同的职责。以下是它们的详细解释和对比: 1. **Servlet**: - Servlet是一个Java类,用于扩展服务器的功能。它们在...
1. Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。 2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。 3. Filter对几乎所有的请求起作用,而Interceptor...
这个项目涵盖了Web开发中的多个重要知识点,包括用户登录处理、拦截器(Interceptor)的应用以及过滤器(Filter)的使用。让我们逐一展开这些核心内容。 1. **Spring框架**:Spring是Java企业级应用的主流框架,它...
可以看到,Filter 的编写需要实现 `javax.servlet.Filter` 接口,并添加注解 `@WebFilter(filterName = "myFilter", urlPatterns = "/*")`。 三、Listener 在 Spring Boot 中,编写 Listener 需要实现 `javax....
Java Web开发是构建基于Web的应用程序的关键技术,涵盖了多种组件和技术,如Servlets、JSP、过滤器、监听器和自定义标签等。本篇主要关注的是Java Web开发中的过滤器、监听器和自定义标签。 1. **过滤器(Filter)*...