`

【Java Web】Filter vs Interceptor

    博客分类:
  • Java
 
阅读更多

我们说的 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)

 

典型使用场景:

  1. 身份验证
  2. 日志、审计
  3. 图像转换
  4. 数据压缩
  5. 加解密
  6. 访问令牌处理
  7. 触发资源访问事件2
  8. XSL 转换(XSL/T)
  9. 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();
    ...
  }
}
  • 大小: 45.9 KB
  • 大小: 42.9 KB
分享到:
评论

相关推荐

    Java WEB 篇九 Java servlet、filter、listener、interceptor ?.xmind

    Java WEB 篇九 Java servlet、filter、listener、interceptor 之间的区别和联系?

    Filter以及Interceptor的区别

    在Java Web开发领域,特别是使用Struts2框架时,Filter和Interceptor是两个非常重要的概念。它们都是用来拦截请求并执行特定逻辑的机制,但它们之间存在一些关键的区别。 #### 一、Filter概述 **Filter** 是...

    Struts2_interceptor_和_filter区别

    - **回调与反射机制**:Filter通过回调函数`doFilter()`执行,而Interceptor基于Java反射机制,这使得Interceptor能够在不修改原始Action代码的情况下,动态地添加或修改行为。 - **配置与集成**:Filter的配置相对...

    开发者突击Java Web主流框架

    8. **Filter和Listener**:Java Web应用中的Filter和Listener可以监听和过滤HTTP请求,实现登录验证、性能监控等功能。 9. **安全控制**:Spring Security和Apache Shiro是Java Web安全框架,提供身份验证、授权、...

    webfilter的教程

    在Java Web开发中,`Filter`是一个至关重要的组件,它属于`javax.servlet`包,用于在请求被实际处理之前和之后进行预处理和后处理。本教程将详细讲解`Filter`的两个主要功能:字符编码过滤和登录验证。 首先,让...

    Interceptor与Filter的区别

    在Java Web开发中,拦截器(Interceptor)与过滤器(Filter)是两种常见的处理请求和响应的技术。它们虽然都用于在请求处理前后执行某些操作,但其实现机制、应用场景以及作用范围等方面存在较大差异。下面将详细...

    从零学Java Web PPT

    10. **Struts2**: Struts2是基于MVC模式的开源Web应用框架,它提供了一种组织应用结构的方式,简化了Java Web开发流程,通过Action、Interceptor和Result等核心概念,实现了业务逻辑和表现层的分离。 这套【从零学...

    SpringBoot中使用Filter和Interceptor的示例代码

    Interceptor需要实现org.springframework.web.servlet.HandlerInterceptor接口,HandlerInterceptor接口有三个方法:preHandle、postHandle和afterCompletion。preHandle方法用于在业务处理器处理请求之前被调用,...

    java-web -- servlet 拦截器 过滤器使用

    在Java Web开发中,Servlet、拦截器(Interceptor)和过滤器(Filter)是三个非常重要的概念,它们在处理HTTP请求和响应时起到了关键作用。理解并熟练运用这三者能够帮助开发者实现更高效、更安全的Web应用。 首先...

    java web开发常用模块源代码

    在Java Web开发中,我们经常会遇到各种各样的模块,这些模块是构建复杂应用程序的基础。"java web开发常用模块源代码"这个主题涵盖了这些模块的核心源代码,为开发者提供了宝贵的参考资料。下面将详细介绍一些常见的...

    Interceptor.doc

    拦截器(Interceptor)是一种在Java Web开发中广泛使用的可插拔组件设计,它允许开发者在不修改核心处理代码的情况下,对请求和响应进行拦截,提供标准化的服务。这种设计模式能够独立地增强系统的功能,提高代码的...

    java web 系统权限设计 源码

    - Filter或Interceptor:在Java Web中,通常会在请求处理之前使用Filter或Spring MVC的Interceptor进行权限拦截,检查用户是否具备访问资源的权限。 - Spring Security:这是一个强大的安全框架,提供了完善的权限...

    架构探险—从零开始写Java Web框架

    7. **拦截器与过滤器**:使用Filter和Interceptor进行请求预处理和后处理,例如登录检查、日志记录、性能监控等。 8. **模板引擎**:学习使用模板引擎来简化视图层的编写,如FreeMarker或Velocity,让开发者可以...

    Java servlet、filter、listener、interceptor之间的区别和联系

    Java Web开发中,Servlet、Filter、Listener和Interceptor这四种组件在处理请求和响应的过程中扮演着不同的角色,它们都是Java EE规范中不可或缺的部分,用于增强应用程序的功能和灵活性。 **1. Servlet** Servlet...

    filter__serverlet__listener与interceptor的相同点与区别.doc

    在Web开发中,`filter`、`servlet`、`listener`和`interceptor`都是重要的组件,它们各自承担着不同的职责。以下是它们的详细解释和对比: 1. **Servlet**: - Servlet是一个Java类,用于扩展服务器的功能。它们在...

    浅谈SpringMVC中Interceptor和Filter区别

    1. Filter是基于函数回调(doFilter()方法)的,而Interceptor则是基于Java反射的(AOP思想)。 2. Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。 3. Filter对几乎所有的请求起作用,而Interceptor...

    完整的Java web 实例

    这个项目涵盖了Web开发中的多个重要知识点,包括用户登录处理、拦截器(Interceptor)的应用以及过滤器(Filter)的使用。让我们逐一展开这些核心内容。 1. **Spring框架**:Spring是Java企业级应用的主流框架,它...

    Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

    可以看到,Filter 的编写需要实现 `javax.servlet.Filter` 接口,并添加注解 `@WebFilter(filterName = "myFilter", urlPatterns = "/*")`。 三、Listener 在 Spring Boot 中,编写 Listener 需要实现 `javax....

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx

    Java Web开发是构建基于Web的应用程序的关键技术,涵盖了多种组件和技术,如Servlets、JSP、过滤器、监听器和自定义标签等。本篇主要关注的是Java Web开发中的过滤器、监听器和自定义标签。 1. **过滤器(Filter)*...

Global site tag (gtag.js) - Google Analytics