23

过滤器和拦截器之间有什么区别?我意识到拦截器在动作之前和之后以递归方式触发,并且过滤器可以配置为在动作和某些 url 模式上触发。但是你怎么知道什么时候使用每一个呢?

在我正在阅读的关于 Struts 2 的书中,似乎正在推送拦截器,我什至按照教程编写了一个身份验证拦截器以确保用户已登录。但是,如果用户尝试访问一个没有'没有与之关联的动作,拦截器不会捕获它,这意味着我必须将一个动作与我想要安全的每个 jsp 相关联。这似乎不对。

我可以制作一个处理 URL 的身份验证过滤器,这样我就不必这样做了,但是,拦截器的意义何在?

4

6 回答 6

45

最显着的区别是“拦截器”是 Struts 2 框架的一部分,并且只是 Struts 2 框架完成的请求处理的一部分。另一方面,“过滤器”是 Servlet 规范的一部分;换句话说,它们是 Servlet API 的一部分。如果您使用的是 Struts 2,您应该使用拦截器来包装您的 Struts 2 操作周围的功能。如果您尝试将功能包装在进入您的 web 应用程序的请求中,但没有被 Struts 2 处理,那么过滤器可能更合适。

顺便说一句,整个 Struts 2 框架部署在您的 Web 应用程序中配置的过滤器中,在您的 Web 应用程序的部署描述符 ( web.xml ) 中声明,例如:

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>

     <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

这个过滤器被配置为捕获所有请求 URL 模式,是整个 Struts 2 框架的入口点。

我希望这会有所帮助。

于 2011-08-03T15:49:39.230 回答
5

拦截器堆栈在每个请求上触发。
过滤器仅适用于为其定义的 url。

编辑——您可以根据需要使用其中一种。假设您需要验证每个请求是否存在 cookie。使用拦截器。假设您需要在某些请求(由 url 驱动)上弹出一个外部应用程序,使用过滤器。

我认为拦截器是更常用的工具......

为什么你会有一个没有相关操作的 url?

于 2010-07-15T14:49:39.823 回答
4

什么是拦截器?

Struts 2 框架使用拦截器的概念,通过不同的操作来共享一些常见问题的解决方案。

正如我们所知,框架在提交请求时调用特定的 Action 对象。但是在执行 Action 之前,调用会被其他对象拦截以提供所需的额外处理。

同样在Action执行后,调用可以再次被拦截。这个拦截对象被称为拦截器。

所以使用 Interceptor 的目的是允许对控制器层进行更好的控制,并分离一些适用于多个动作的通用逻辑。

Struts 2 框架已经提供了它自己的一组拦截器,可以在应用程序中使用它来在 Action 类执行之前和之后提供所需的处理。

其中之一是我将在这里讨论的“别名拦截器”。

别名拦截器:

别名拦截器用于动作链接的情况。动作链接意味着一个动作在成功执行第一个动作后调用另一个动作。

此拦截器将命名参数别名为不同的参数名称。在动作链接中,当两个不同的动作类共享一个不同名称的公共参数时,该拦截器用于为第一个动作类的参数赋予别名,该别名与第二个动作类中的参数名称匹配。

action 的别名表达式应为:

             #{ 'name1' : 'alias1' , 'name2' : 'alias2' }
于 2013-04-30T12:01:51.413 回答
3

根据 struts 2 生命周期/架构,在过滤器之前不执行任何拦截器。因此,如果您的请求没有操作映射,那么它在通过过滤器时会失败。

于 2013-12-15T13:30:46.223 回答
1

根据经验

  • 过滤器在每个request. 它struts本身就是一个过滤器。
  • interceptors可以在struts动作之前,之后运行。如果请求不以 结尾,它们将不会运行.action

因此,过滤器的一些示例可能是:

  • 如果你想压缩你的jscss文件,你应该选择过滤器而不是拦截器。
  • 如果您只希望某些 IP 地址访问您的网站,则必须将其开发为过滤器并检查请求 IP 地址。
  • 如果你想保护你的站点免受 CSRF 攻击,你必须编写一个过滤器来检查请求中的 CSRF 令牌。
  • 如果要记录每个请求时间的站点响应,可以使用过滤器计算前后时间chain.doFilter(request, response)

从理论上讲,您可以开发一个 struts Web 应用程序,而无需开发自己的interceptors并且filters仅使用。但是您将面临很多问题并编写锅炉过滤器。

很多 struts 2 特性都是用拦截器构建的,你可以在 struts-default.xml ( https://struts.apache.org/docs/struts-defaultxml.html ) 中找到它,该列表将有助于找到何时可以使用拦截器. (例如在操作之前ParametersInterceptor运行以将提交的表单值应用于操作)

在使用拦截器时,您可以轻松访问 struts 功能,例如getText从消息资源、获取当前操作名称和名称空间、更改操作流程。

考虑到上面的一些情况,拦截器可以开发:

  • 如果您希望只有登录用户才能访问某些操作,则必须使用拦截器进行开发。
  • 如果您想跟踪用户正在导航的操作。您可以使用拦截器来跟踪访问的操作。
  • 如果你想单点处理你的动作错误,你可以使用一个拦截器来捕获所有invocation.invoke()

拦截器为 struts 操作提供了过滤器和责任链设计模式,而过滤器为您的整个 Web 应用程序提供了这种模式。

于 2016-02-24T17:27:42.573 回答
0

Struts 2 Framework 不依赖于 Servlet API。Struts 2 Actions 不与容器耦合。大多数情况下,servlet 上下文表示为简单的 Map,允许单独测试 Action。

过滤器是 Servlet API 的一部分,因此 Struts 2 框架使用拦截器的概念来共享不同操作的一些常见问题的解决方案。

您还可以轻松地为 Interceptor 和 Action 类编写测试用例。

于 2014-11-19T07:28:42.813 回答