SSH整合之Filter详解
Strust2的中央处理器FilterDispatcher(StrutsPrepareAndExecuteFilter是2.13版本后推荐使用的)是一个Filter。要详细理解strust2那么首先就要先弄明白Filter是个什么东东。简而言之,Filter就是过滤器,它的作用类似于后面要说到的拦截器,而且很多情况下拦截器可以代替过滤器,不过还是需要知道Filter的基本信息,下面是摘录的一位外国大拿对Filter的认识:
Servlet 过滤器是小型的 Web 组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。过滤器是通常封装了一些功能的 Web 组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性,等等。过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中,这些组件通过一个配置文件来声明,并动态地处理。
Servlet 过滤器中结合了许多元素,从而使得过滤器成为独特、强大和模块化的 Web 组件。也就是说,Servlet 过滤器是:
声明式的:过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明。这样允许添加和删除过滤器,而无需改动任何应用程序代码或 JSP 页面。
动态的:过滤器在运行时由 Servlet 容器调用来拦截和处理请求和响应。
灵活的:过滤器在 Web 处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处理,以及处理在防火墙之后的 Web 组件之间调度的请求。最后,可以将过滤器链接起来以提供必需的功能。
模块化的:通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。
可移植的:与 Java 平台的其他许多方面一样,Servlet 过滤器是跨平台和跨容器可移植的,从而进一步支持了 Servler 过滤器的模块化和可重用本质。
可重用的:归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。
透明的:在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet 或 JSP 页面提供的核心处理。因而,过滤器可以根据需要添加或删除,而不会破坏 servlet 或 JSP 页面。这是对Filter的理论认识,不过Filter的实践认识很简单,他就是一个过滤器,将request发送的请求进行过滤,比如一个模块希望记录操作日志,就可以在过滤器里实现记录日志的逻辑,然后再继续流转到下个模块,其实和拦截器有异曲同工之妙。不再详细赘述,下面是Filter的实现。
想开发自己的Filter需要实现servlet的javax.servlet.Filter接口,然后需要实现3个方法即:public void destroy(),public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException,public void init(FilterConfig arg0) throws ServletException。这3个方法涵盖了Filter的整个生命周期,init是Filter初始化时需要做的任务,你可以在这里做一些准备工作,有个参数FilterConfig,这个对象里可以读取配置文件中设置的信息,以及Filter的基本信息和web服务器的基本信息。
doFilter是实现过滤逻辑的地方,前两个对象即时request和response,FilterChain对象可以通过doFilter方法将请求流转到下一个模块,其实就是过滤器的出口,当你的过滤逻辑实现完成之后请求就可以继续流转,不如请求不符合过滤逻辑,那么请勿调用doFilter方法。destroy方法是过滤器的销毁方法,一般情况下可以置空不实现。
Filter的配置是在web.xml中的,基本结构如下:
<filter> <filter-name>Page Request Timer</filter-name> <filter-class>TimeTrackFilter</filter-class> </filter> <filter-mapping> <filter-name>Page Request Timer</filter-name> <servlet-name>Main Servlet</servlet-name> </filter-mapping> <servlet> <servlet-name>Main Servlet</servlet-name> <servlet-class>MainServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Main Servlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
这是对某个特定的servlet进行过滤,也可以使用通配符进行过滤,如下:
<filter> <filter-name>Page Request Timer</filter-name> <filter-class>TimeTrackFilter</filter-class> </filter> <filter-mapping> <filter-name>Page Request Timer</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>
这时只过滤以.do为结尾的资源。
strust2的过滤器配置是以*为url-pattern的,即是过滤所有请求