Filter Struts 2中的过滤器与拦截器

Filter Struts 2中的过滤器与拦截器,filter,struts2,interceptor,Filter,Struts2,Interceptor,过滤器和拦截器之间的区别是什么?我意识到拦截器在动作之前和之后以递归方式启动,过滤器可以配置为在动作和特定url模式上启动。但是你怎么知道什么时候使用每一个呢 在我读的关于Struts 2的书中,似乎有人在推送拦截器,我甚至按照教程编写了一个身份验证拦截器,以确保用户登录。但是,如果用户试图访问一个没有关联操作的URL,拦截器将无法捕获它,这意味着我必须将一个操作与我希望安全的每个jsp关联。这似乎不对 我可以制作一个身份验证过滤器来处理URL,这样我就不必这样做了,但是,拦截器有什么意义呢?拦

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

在我读的关于Struts 2的书中,似乎有人在推送拦截器,我甚至按照教程编写了一个身份验证拦截器,以确保用户登录。但是,如果用户试图访问一个没有关联操作的URL,拦截器将无法捕获它,这意味着我必须将一个操作与我希望安全的每个jsp关联。这似乎不对


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

拦截器堆栈会在每次请求时触发。
筛选器仅适用于为其定义的URL

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

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


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

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

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


支柱2
org.apache.struts2.dispatcher.ng.filter.strutspreadexecutefilter
支柱2
/*
此过滤器配置为捕获所有请求URL模式,是整个Struts 2框架的入口点

我希望这有帮助

什么是拦截器

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

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

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

所以,使用拦截器的目的是允许对控制器层进行更大的控制,并分离一些应用于多个操作的通用逻辑

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

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

别名拦截器:

别名拦截器用于操作链接。动作链接是指一个动作在成功执行第一个动作后调用另一个动作

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

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

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

根据struts 2生命周期/体系结构,在筛选之前不执行拦截器。所以,若您的请求并没有动作映射,那个么它在通过过滤器时就会失败

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

过滤器是ServletAPI的一部分,因此Struts2框架使用拦截器的概念,通过不同的操作共享一些常见问题的解决方案

此外,您还可以轻松地为拦截器和操作类编写测试用例。

作为经验法则

  • 过滤器在每个
    请求之前运行。
    struts
    本身就是一个过滤器
  • 拦截器可以在struts操作之前、之后运行。如果请求未以
    结束,则它们将不会运行。操作
因此,过滤器的一些示例可以是:

  • 如果你想压缩你的
    js
    css
    文件,你应该选择过滤器而不是拦截器
  • 如果您只希望某个IP地址访问您的网站,则必须将其开发为筛选器并检查请求IP地址
  • 如果您想保护您的站点免受CSRF攻击,您必须编写一个过滤器来检查请求中的CSRF令牌
  • 如果您想记录每个请求时间的站点响应,您可以使用筛选器计算chain.doFilter(请求,响应)
理论上,您可以开发struts web应用程序,而无需开发自己的
拦截器
,也无需仅使用
过滤器
。但您将面临许多问题和代码锅炉过滤器

struts 2的许多功能都是使用拦截器构建的,您可以在struts-default.xml()中找到它。该列表将帮助您找到何时可以使用拦截器。(例如,
参数接收器
在操作之前运行,将提交的表单值应用于操作)

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