在 Struts2 中使用过滤器作为控制器

Posted

技术标签:

【中文标题】在 Struts2 中使用过滤器作为控制器【英文标题】:Filter is used as controller in Struts2 【发布时间】:2012-04-02 14:27:06 【问题描述】:

struts2 中,为什么使用过滤器而不是ActionServlet 作为控制器?

相比ActionServlet,使用过滤器有什么优势?

【问题讨论】:

【参考方案1】:

根据 Struts2 Budi Karnival struts2 一书,使用过滤器而不是 servlet 作为控制器有一个明显的优势。使用过滤器,您可以方便地选择为应用程序中的所有资源提供服务,包括静态资源。

使用 servlet,您的控制器只处理对应用程序动态部分的访问。注意前面应用中web.xml文件中的url-pattern元素是

<servlet> 
  <servlet-name>Controller</servlet-name>
  <servlet-class>...</servlet-class>
</servlet>

<servlet-mapping>
  <servlet-name>Controller</servlet-name>
  <url-pattern>*.action</url-pattern>
</servlet-mapping>

通过这样的设置,对静态资源的请求不是由 servlet 控制器处理,而是由容器处理。您不想在 servlet 控制器中处理静态资源,因为这意味着额外的工作。

过滤器不同。过滤器可以选择允许对静态内容的请求。要传递请求,请在过滤器的 doFilter 方法中调用 filterChain.doFilter 方法。

因此,使用过滤器作为控制器可以阻止对应用程序的所有请求,包括对静态内容的请求。然后,您的部署描述符中将包含以下设置:

<filter>
   <filter-name>filterDispatcher</filter-name>
   <filter-class>...</filter-class>
</filter>
<filter-mapping>
  <filter-name>filterDispatcher</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

此过滤器的优点:可以肯定的是,您可以轻松保护静态文件免受好奇的目光。

如果用户尝试查看 javascript 文件,以下代码将发送错误消息:

public void doFilter(ServletRequest request, ServletResponse response,FilterChain      filterChain) throws IOException, ServletException  
    HttpServletRequest req = (HttpServletRequest) request; 
HttpServletResponse res = (HttpServletResponse) response; 
String uri = req.getRequestURI(); 
if (uri.indexOf("/css/") != -1 && req.getHeader("referer") == null)  
    res.sendError(HttpServletResponse.SC_FORBIDDEN);
 else 
    // handle this request

 

它不会保护您的代码免受最坚定的人的攻击,但用户不能再输入您的静态文件的 URL 来查看它。出于同样的原因,您可以保护您的图像,这样任何人都不能自费链接到它们。

另一个优势:

在 Struts2 框架中引入拦截器。它不仅减少了我们的编码工作量,而且帮助我们编写了任何代码,我们将使用过滤器进行编码和在 web.xml 中进行必要的更改,而不是 Struts1。所以现在任何代码更适合Filter的现在可以移动到拦截器(比过滤器更可控),所有配置都可以在struts.xml文件中控制,无需触摸web.xml文件

【讨论】:

@Punit_Patel 如果 Struts 1 的 ActionServletservlet-mapping 设置为 / 而不是 *.action,那么 Struts 1 会不会捕获所有静态内容并采取行动与 Strut 2 的 FilterDispatcher? 相同 @7SpecialGems 如果使用 / 作为 ActionServlet 的 url 映射,则必须编写额外的代码。例如,对于 CSS 文件,您必须编写代码以读取 CSS 文件并写入响应对象。而在过滤器的情况下,您可以在过滤器的doFilter方法中调用filterChain.doFilter方法。【参考方案2】:

当我们想要根据特定条件过滤和/或修改请求时,我们通常会使用过滤器。 要使 S2 正常工作,它需要执行某些重新处理和修改工作才能成功执行您的请求,而另一方面,当我们想要控制、预处理和/或后处理请求时,我们会使用 Servlet。

为了控制请求 S2,在后台使用 Servlet,但被隐藏起来以使整个应用程序结构更加简洁和易于使用。

这就是我们在Java EE 6 Tutorial 中的过滤器。

过滤器是一个可以转换请求或响应的标头和内容(或两者)的对象。过滤器与 Web 组件的不同之处在于过滤器本身通常不会创建响应。相反,过滤器提供可以“附加”到任何类型的 Web 资源的功能。因此,过滤器不应该对作为过滤器的 Web 资源有任何依赖关系;这样,它可以与不止一种类型的网络资源组成。

【讨论】:

以上是关于在 Struts2 中使用过滤器作为控制器的主要内容,如果未能解决你的问题,请参考以下文章

Struts2--使用Struts登录

Struts2工作流程

框架学习第一天——struts2_01

Struts2 回顾总结

struts2

Struts2初始