聊一下你对拦截器、过滤器的认识
Java 中的拦截器和过滤器都是常见的用于拦截和处理系统请求的技术手段,它们的主要作用是在系统的关键点上增加通用的处理逻辑,以达到代码的复用和系统的解耦等目的。
相同点:
- 都可以对请求进行拦截和处理,增加通用的处理逻辑。
- 都可以实现系统的安全控制、日志记录、性能优化、缓存控制等功能。
- 都可以通过配置来使用,灵活性高,易于维护和扩展。
不同点:
- 拦截器通常针对于应用程序级别的请求处理,例如在 Spring MVC 中,可以定义拦截器来对请求进行拦截和处理,拦截器可以在请求处理前、处理后或者视图渲染之前进行处理,可以对请求进行认证、授权、日志记录等操作。而过滤器是基于 Servlet 规范的一种技术,可以拦截所有的 Web 请求,对请求进行处理,可以对请求进行编码转换、字符集设置、安全控制等操作。
- 拦截器的处理是基于 Java 反射机制实现的,因此可以对方法级别进行拦截,可以在方法执行前后进行处理。而过滤器的处理是基于 Servlet 规范实现的,可以对请求和响应进行处理。
- 拦截器的使用范围相对较小,主要用于应用程序级别的请求处理,而过滤器的使用范围更广,可以对所有的 Web 请求进行拦截和处理。
拦截器和过滤器的执行处于请求生命周期的不同阶段:
- 拦截器的执行在请求处理前、处理后或者视图渲染之前进行处理,主要是针对于应用程序级别的请求处理。在 Spring MVC 中,拦截器的执行是在 HandlerMapping 完成匹配之后,调用处理器之前进行处理的。
- 过滤器的执行是在请求到达 Servlet 容器之前进行处理的,可以对请求进行全面的处理。在 Servlet 生命周期中,过滤器的执行是在 Servlet 被调用之前进行的,也可以在 Servlet 被调用之后进行处理。