2010-07-15 214 views
21

过滤器和拦截器之间的区别是什么?我意识到拦截器在动作之前和之后触发,并且可以将过滤器配置为触发动作和特定的url模式。但你怎么知道什么时候使用每一个?Struts 2中的过滤器和拦截器2

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

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

+10

将.jsp粘贴到/ WEB-INF文件夹是一种很好的做法。这样他们不能被URL直接请求。相反,用户应该通过Actions,然后转发到正确的jsp(取决于结果)。 – Pat 2010-07-15 15:24:25

回答

4

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

编辑 - 您根据需要使用一种或另一种。假设您需要验证每个请求都存在Cookie。用户一个拦截器。假设您需要在某些请求(由url驱动)上弹出一个外部应用程序,请使用过滤器。

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

为什么你有没有相关的动作网址?

+0

拦截器堆栈仅激发在该堆栈中为其定义的默认堆栈中定义的请求,也就是说,我可以在其他程序包中定义的操作(拦截器不会像过滤器那样触发),它可以是选择性的。过滤器也可以应用于所有网址。 要验证cookie是否存在,我不明白为什么你不会为此使用过滤器。 如果你有一个简单的jsp,比如图片上传表单,那么可能没有任何工作需要我采取行动。我应该为每个jsp制作操作类吗?即使它们是空的? – JPC 2010-07-15 15:28:28

+0

不,你是对的,如果没有一个动作点,那么不要放一个动作。虽然从我记得的行动可以路由到一个jsp只是返回一个字符串值。 我想你会发现有很多方法可以做事,所以有一些重叠的事实是很自然的。 – hvgotcodes 2010-07-15 15:40:41

+0

我想我只是在寻找最佳做法,并且一直未能找到任何答案。 特别是现在使用约定插件,如果我有一个上传表单,我可以通过键入“/ upload-form”来访问它,我甚至不需要直接访问jsp。问题是,这不会触发一个拦截器,所以过滤器是唯一能够解决这个问题的东西。 – JPC 2010-07-15 15:45:32

42

最大的区别是“拦截器”是Struts 2框架的一部分,它只是Struts 2框架完成的请求处理的一部分。另一方面,“过滤器”是Servlet规范的一部分;换句话说,它们是Servlet API的一部分。如果你使用的是Struts 2,你应该使用拦截器来围绕你的Struts 2动作打包功能。如果您试图围绕来自您的Web应用程序的请求打包功能,但未被Struts 2处理,那么过滤器可能更合适。

BTW,整个Struts 2框架部署就像在你的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框架的入口点。

我希望有帮助。

+0

感谢关于Servlet Spec和Struts 2框架差异化的提示。 – asgs 2012-05-02 05:53:05

+0

这意味着它们具有相同的功能。 – hiway 2013-12-08 08:02:47

+2

@hiway我不会说他们具有相同的功能,我会说他们在两种截然不同的环境中发挥相同的功能。 – chad 2014-01-07 19:33:21

4

什么是拦截器?

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

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

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

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

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

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

别名拦截:

别名拦截器在行动链接的情况下使用。动作链接意味着一个Action在成功执行第一个动作后调用其他动作。

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

别名表达应该在的形式:

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

作为每撑杆2生命周期/架构不拦截器滤波器之前执行。因此,如果没有针对您的请求的操作映射,那么它在通过过滤器时失败。

0

Struts 2框架不依赖于Servlet API。 Struts 2操作未耦合到容器。大多数情况下,servlet上下文都表示为简单的映射,允许单独测试动作。

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

此外,您还可以轻松编写Interceptor和Action类的测试用例。

0

由于

  • 器中的每request前运行的经验法则。 struts本身是一个过滤器。
  • interceptors可以在struts动作之前运行。如果请求不以.action结束,它们将不会运行。

所以,过滤器的一些例子是:

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

理论上你可以不开发自己的interceptors和使用filters发展的支柱Web应用程序只要。但是你会遇到很多问题和代码锅炉过滤器。

很多struts 2特性都是用拦截器构建的,你可以在struts-default.xml(https://struts.apache.org/docs/struts-defaultxml.html)中找到它,这个列表将帮助找到何时可以使用拦截器。 (例如ParametersInterceptor运行之前行动到submited形式值适用于操作)

虽然你可以轻松地访问支柱功能拦截从信息资源的工作,例如getText,获得当前操作名称和命名空间,改变动作流。

上述这里考虑有某些情况下,可以由拦截器开发:

  • 如果你想,只有在用户可以访问某些操作记录,你必须用拦截器开发。
  • 如果您想跟踪用户导航的操作。您可以使用拦截器来跟踪访问的操作。
  • 如果你想处理在一个点你采取行动的错误,你可以使用捕捉所有invocation.invoke()

拦截器提供责任设计模式的过滤器和链支柱的行动,而过滤器的拦截器将此模式提供给您的整个Web应用程序。