filter跟拦截器的区别和执行顺序
发布网友
发布时间:2022-04-29 16:49
我来回答
共1个回答
热心网友
时间:2023-08-16 20:34
filter和*的区别和执行顺序
1.Filter过滤器只过滤jsp文件不过滤action请求解决方案
解决办法:在web.xml中将filter的配置放在struts2配置的前面。
2.*与Filter的区别
Spring的*与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而*既可以用于Web程序,也可以用于Application、Swing程序中。
规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而*是在Spring容器内的,是Spring框架支持的。
使用的资源不同:同其他的代码块一样,*也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到*即可;而Filter则不能。
深度不同:Filter在只在Servlet前后起作用。而*能够深入到方法前后、异常抛出前后等,因此*的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用*。
实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。
filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响 应,它只是修改对某一资源的请求,或者修改从某一的响应。
JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序 来执行的。
所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的 DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。
当Filter被调用,并且进入了Struts2的DispatcherFilter中 后,Struts2会按照在Action中配置的Interceptor Stack中的Interceptor的顺序,来调用Interceptor。