回答
我们通常在我们想要根据特定条件过滤和/或修改请求时使用过滤器。 为了S2的工作,它需要执行某些重新处理和修改工作,以便成功执行您的请求,而另一方面,当我们想要控制,预处理和/或后处理请求时,我们使用Servlet。
为了控制请求S2使用Servlet在引擎盖下但被隐藏起来使整个应用程序结构更加干净和易于使用。
这是我们在Java EE 6 Tutorial中的过滤器。
过滤器是一个可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于过滤器通常本身不会创建响应。相反,过滤器提供的功能可以“附加”到任何种类的网络资源。因此,一个过滤器不应该对其作为过滤器的Web资源有任何依赖关系;这样,它可以由多种类型的网络资源组成。
根据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 framework.It引入拦截器的不只是减少我们的编码工作,而是帮助我们写,我们会使用过滤器进行编码,并在网上必要改变任何代码。 xml,而不是Struts1.So现在,任何适合Filter的代码现在都可以转移到拦截器(这比拦截器更易于控制),所有配置都可以在struts.xml文件中控制,无需触摸web.xml文件
- 1. 过滤器无法在Struts2中工作
- 2. 使用angularjs控制器的过滤器
- 3. 控制器中的过滤器 - 角度
- 4. 控制器中的过滤器值
- 5. 控制器和动作中的执行动作过滤器
- 6. 在控制器中过滤记录
- 7. 过滤树控制器
- 8. 是否有一个动作过滤器覆盖控制器过滤器?
- 9. 在控制器中使用角度过滤器过滤非匹配对象
- 10. yii控制器中的访问控制过滤器规则
- 11. Laravel控制器中的每种方法的动作过滤器
- 12. angular-UI datepicker在控制器中应用日期过滤器
- 13. 您如何在模块化控制器中使用过滤器?
- 14. Shoulda:测试控制器过滤器
- 15. angularJs过滤器从控制器
- 16. 在一个类中制作过滤器
- 17. 如何在ORM中制作过滤器?
- 18. 如何在Spinner中制作过滤器?
- 19. 制作搜索过滤器
- 20. 从基础控制器获取操作过滤器列表
- 21. 将过滤器作为查看对象传递给控制器
- 22. 如何为所有控制器编写动作过滤器
- 23. 添加/删除缓存作为控制器上的过滤器
- 24. 带控制器动作过滤器的ASP.NET MVC DI
- 25. 如何在过滤器内使用控制器的变量
- 26. 使用在多个控制器(AngularJS)自定义过滤器
- 27. 使用之前的过滤器或停留在控制器?
- 28. 从控制器中的不同JS文件调用过滤器
- 29. 禁用控制器过滤器中的布局渲染
- 30. 如何在rspec控制器测试期间登录rails控制器过滤器
@Punit_Patel如果Struts 1的'ActionServlet'的'servlet-mapping'被设置为'/'而不是'* .action',Struts 1会不会捕获所有的静态内容和行为方式与Strut 2的FilterDispatcher相同? – 8bitjunkie 2014-07-13 17:15:31
@ 7SpecialGems如果使用/作为ActionServlet的url映射,则必须编写额外的代码。例如,在CSS文件的情况下,您必须编写读取CSS文件的代码并写入响应对象。而在Filter的情况下,您可以在过滤器的doFilter方法中调用filterChain.doFilter方法。 – 2014-07-14 13:26:01