拦截器或过滤器

Posted

技术标签:

【中文标题】拦截器或过滤器【英文标题】:Interceptors Or Filters 【发布时间】:2014-06-16 09:26:53 【问题描述】:

我正在开发一个 Spring 应用程序,我想在其中进行一些安全检查,例如文件的 MD5 检查、数据库检查、应用程序版本检查等。

我已经阅读了有关拦截器和过滤器的内容,但仍然对哪个更好用感到有些困惑。

无论我读过什么文档,都指定过滤器和拦截器都可用于日志记录和审计,因此哪一个更适合这种情况。 此外,所有这些安全检查(文件的 MD5 检查、DB 检查、应用程序版本检查)都可以配置,这意味着 DB 检查是允许的,应用程序版本检查也是允许的。

【问题讨论】:

Spring HandlerInterceptor vs Servlet Filters 的副本 【参考方案1】:

在我看来,过滤器和拦截器之间最大的区别之一是:

过滤器只适用于J2EE web应用程序,不能在应用服务器之外使用,拦截器可以工作在不同的组件中,不依赖于web层,总之拦截器比过滤器有更广泛的领域。 如果您打算将某些组件移出容器,则应考虑使用拦截器。

过滤器更多地在请求/响应域中起作用,而拦截器更多地在方法执行域中起作用。

如果您需要做一些可能影响对您的应用程序的请求或响应的事情,例如日志记录、安全性、审计,或者您会影响到它们的数据,您的选择是过滤器,不要忘记插件功能那些提供。

拦截器与 Java EE 托管类一起使用 允许开发人员在关联目标上调用拦截器方法 类,结合方法调用或生命周期事件

【讨论】:

感谢您的快速回复,我可能是错的,但根据您的句子过滤器适用于 Web 层,拦截器可以在任何地方使用,对吧? Filter 是一个 Web 组件,另一方面,拦截器可以在目标类中定义为拦截器方法,或者在称为拦截器类的关联类中定义,并且可以在任何地方使用,只依赖于如果您正在使用某个框架,则 javax.interceptor 广泛 好的,我知道了。我将使用拦截器,但我不打算将任何组件移出容器外,因为我还不清楚从容器中取出的含义。我将使用拦截器,因为如果任何安全检查失败,那么我可以更改可以使用拦截器完成的 ModelAndView。对吗? 是的,您可以在拦截器的处理程序方法中使用 springMVC 拦截器和 trycatch 异常,但这也可以使用过滤器 XD 来完成,这里的另一个区别是过滤器不是由 spring 容器管理的,所以你会失去自动装配选项【参考方案2】:

我来晚了,虽然我想分享一下我的看法。

过滤器仅用于 web 层,因为它在 web.xml 中定义。我们不能在网络环境之外使用它。虽然 Spring 拦截器可以在任何地方使用,因为它是在应用程序上下文中定义的。

考虑到上述差异,对于来自网页的传入请求的登录身份验证和审核,我们应该使用 servlet 过滤器。在实现业务层日志记录和审计以及许多其他功能时,我们应该使用拦截器。

除此之外,如果您使用的是 Spring MVC。那么您希望将过滤或拦截的所有逻辑保留在一个框架中,而不是在 servlet 过滤器中编写一些逻辑,而在 spring 中编写其他逻辑。

Spring 除了 before 和 after 方法之外,还给 afterCompletion 一个额外的控制点

【讨论】:

以上是关于拦截器或过滤器的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 拦截器/过滤器/监听器

java web 拦截器过滤器理解

java web 过滤器跟拦截器的区别和使用

java项目和web项目中的过滤器文件怎么使用?

struts2 过滤器和拦截器的区别和使用

java 拦截器过滤器监听器