Struts 2中的过滤器与拦截器

时间:2010-07-15 14:40:05

标签: filter struts2 interceptor

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

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

我可以创建一个处理URL的身份验证过滤器,这样我就不必这样做了,但那么,拦截器有什么意义呢?

6 个答案:

答案 0 :(得分:44)

最重要的区别是“拦截器”是Struts 2框架的一部分,并且只是Struts 2框架完成的请求处理的一部分。另一方面,“过滤器”是Servlet规范的一部分;换句话说,它们是Servlet API的一部分。如果您使用的是Struts 2,则应该使用拦截器来绕过Struts 2操作包装功能。如果您试图围绕进入Web应用程序的请求包装功能,但不是由Struts 2处理,那么过滤器可能更合适。

BTW,整个Struts 2 Framework部署在您的Web应用程序中配置的过滤器中,在您的webapp的部署描述符(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框架的入口点。

我希望有所帮助。

答案 1 :(得分:4)

拦截器堆栈会在每次请求时触发 过滤器仅适用于定义它们的URL。

编辑 - 根据需要使用其中一个。假设您需要验证每个请求都存在cookie。用户拦截器。假设您需要在某些请求(由网址驱动)上弹出外部应用,请使用过滤器。

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

为什么你会有一个没有相关行动的网址?

答案 2 :(得分:4)

什么是拦截器?

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

正如我们所知,框架在对它的请求的调用上调用一个特定的Action对象。但在执行Action之前,调用被其他一些对象截获,以提供所需的额外处理。

类似地,在执行Action之后,可以再次拦截调用。这个拦截对象称为拦截器。

因此,使用Interceptor的目的是允许更好地控制控制器层并分离一些适用于多个操作的常见逻辑。

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

其中一个是“Alias Interceptor”,我将在这里讨论。

别名拦截器:

Alias Interceptor用于Action链接。动作链表示一个Action在成功执行第一个动作后调用其他动作。

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

动作的别名表达式应采用以下形式:

             #{ 'name1' : 'alias1' , 'name2' : 'alias2' }

答案 3 :(得分:3)

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

答案 4 :(得分:1)

根据经验

  • 过滤器在每个<button onclick="myFunction()">Click me</button>之前运行。 request本身就是一个过滤器。
  • struts动作之后
  • struts可以运行。如果请求未以interceptors结尾,则它们将无法运行。

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

  • 如果要压缩.actionjs文件,则应使用过滤器而不是拦截器。
  • 如果您只想要某个IP地址访问您的网站,您必须将其开发为过滤器并检查请求IP地址。
  • 如果您想保护您的网站免受CSRF攻击,您必须编写一个过滤器来检查请求上的CSRF令牌。
  • 如果您想要按照请求时间记录您的网站响应,可以使用过滤器来计算css之前和之后的时间

从理论上讲,您可以开发一个struts Web应用程序,而无需开发自己的chain.doFilter(request, response)并仅使用interceptors。但是你将遇到很多问题和代码锅炉过滤器。

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

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

上面考虑的是一些可以由拦截器开发的案例:

  • 如果您希望只有登录用户可以访问某些操作,则必须使用拦截器进行开发。
  • 如果您想跟踪用户导航的操作。您可以使用拦截器来跟踪访问过的操作。
  • 如果您想在一个点上处理您的操作错误,可以使用捕获所有getText的拦截器

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

答案 5 :(得分:0)

Struts 2 Framework不依赖于Servlet API。 Struts 2 Actions没有耦合到容器。通常,servlet上下文表示为简单的映射,允许单独测试Actions。

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

您也可以轻松编写Interceptor和Action类的测试用例。