论坛首页 Java企业应用论坛

过滤器结合servlet的使用

浏览 2685 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-06   最后修改:2010-07-09
什么是过滤器?有什么作用?
从字面的角度讲解而来,过滤器就是过滤一些我们不希望存留下来的对象。如水中的杂物,我们不希望一桶水中有什么杂物,这个时候我们就会想办法来过滤,以便处理掉水中的这些杂物。那么从程序的角度来讲,过滤器又是指什么呢?其实还是和过滤水中杂物一样的原理。如:一个论坛需要实现一个处理一些不良信息的功能,这个时候就可以使用过滤器来解决。当用户发送一个消息(留言)的时候,如果其包含了不良信息(如:脏话,违反论坛规则的语言等等),这个时候我们就可以使用过滤器在客户端与服务器交互的这个过程中,过滤掉这些不良信息。过滤器还有其他的用处,如:当客户端是GET提交的时候,提交的URL是会显示在服务器端的,这个时候我们可以通过篡改URL地址的方式来进入某需登陆才能进入的页面,要解决这个问题,我们也可以是用过滤器。当然过滤器还有很多其他作用,这里就不一一的讲了。
以下是一副过滤器处理的流程:

说了这么多,那如何实现一个过滤器呢?其实很简单,底层的东西都给我们封装好了,我们只管调用已实现的方法就可以了,具体如下。
首先我们写一个类,这个类只要实现javax.servlet.Filter这个接口,那么它就是一个过滤器了,在这个接口中,有三个方法,分别是:

/**在应用程序启动的时候,
*由容器调用,只会执行一次该方法
*
*/
void init(FilterConfig filterConfig)
          throws ServletException

/**对个每个URL映射到该过滤器的时候都会被执行,
*由容器调用。
*
*/		  
void doFilter(ServletRequest request,
              ServletResponse response,
              FilterChain chain)
              throws IOException,
                     ServletException
					 
/**在应用程序关闭的时候,
*由容器调用,只会执行一次该方法
*/					 
void destroy()

在上面的方法中,有如下几种类型的参数FilterConfig,ServletRequest,ServletResponse,FilterChain
其中ServletRequest,ServletResponse是两个接口,我们常用的类似接口HttpServletRequest,HttpServletResponse,其实是这里的ServletRequest,ServletResponse这两个接口的子接口,这里就不多讲了。说说FilterConfig和FilterChain吧。
FilterChain这是一个接口,其中有一个非常有用的方法,即:
/**这个方法是用于将控制权交给下一个过滤器,
*如果该过滤器是最后一个,那么就把控制权交给
*servlet
*/
void doFilter(ServletRequest request,
              ServletResponse response)
              throws IOException,
                     ServletException	


FilterConfig,和上面一样是一个接口,他的作用是得到过滤器在配置文件里面配置的一些信息。常用的有:
String getInitParameter(String name);这个方法是得到我们在配置文件中配置的一些初始化参数信息。更多方法用到的时候可以参考:javax.servlet.FilterConfig这里面。
下面是关于过滤器的配置文件的格式,我们知道servlet和filter是容器来帮我们调用的,这也是java中著名的回调机制,但是底层是怎样实现的呢?答案是在那些技术牛人实现这些底层的时候,为了方便扩展和维护,就使用了XML的配置文件来做一些处理,这样一来就变得更灵活了。下面是servlet的配置文件:
<servlet>
    <servlet-name>和servlet-mapping.name的统一标识</servlet-name>
    <servlet-class>一个servlet全路径</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>和servlet.name的统一标识</servlet-name>
    <url-pattern>/url</url-pattern>
</servlet-mapping>
其实filter的基本配置和servlet类似:
<filter>
    <filter-name>和servlet-mapping.name的统一标识</filter-name>
    <filter-class>一个servlet全路径</filter-class>
</filter>
<filter-mapping>
    <filter-name>和servlet.name的统一标识</filter-name>
    <url-pattern>/url</url-pattern>
</filter-mapping>
其他还有一些配置,如初始化参数的配置是一个较常用的配置,注意的是初始化参数如果要配置,需要放在filter标签元素下面,具体如下:
<filter>
    <filter-name>和servlet-mapping.name的统一标识</filter-name>
    <filter-class>一个servlet全路径</filter-class>
	<init-param>
		<param-name>参数的名字</param-name>
		<param-value>参数的值</param-value>
	</init-param>
</filter>
在filter-mapping这个标签中还有一个很有用的,常见的url-pattern,filter-name就不说了。
那就是<dispatcher></dispatcher>这个标签元素,它的作用是指定过滤器对应请求的方式,其中可以包含四种类型,request,include,forward和error。默认是request。
这个配置过程中需要了解的是<filter-class>是可以使用<servlet-name>来替换的:他们有一点不一样,那就是过滤器的执行顺序。
过滤器的执行顺序。
主要取决于配置文件,如果<filter-mapping>元素中配置URL的是利用<url-pattern>的话,那么它的执行顺序会比其他使用<servlet-name>来配置执行的优先级要高,如果全部都是<url-pattern>元素,那没执行顺序就是你在配置文件写的顺序。同理<servlet-name>配置的就要比<url-pattern>配置的要低,如果全部都是<servlet-name>,那么就是你在配置文件写的那个顺序。
最后,谈谈关于请求和响应的包装器的使用。
请求包装器可以做些什么呢?
我们可以使用请求包装器的原理,把请求做一下处理,在转交给servlet处理。实现步骤:
定义一个处理类,然后继承于javax.servlet.ServletRequestWrapper这个类,在这个类中就封装了一系列的方法来得到发送过来的请求信息,我们可以通过当中的方法得到这些信息,然后重写这些方法,就可以满足我们的需求了。如:我们可以得到请求信息当包含的参数,然后将其参数篡改以后在发送给servlet处理等等。
那么相应包装器呢?
其实它和请求包装器的原理都差不多,但是它实现的接口是javax.servlet.ServletResponseWrapper
实现请求和响应的包装器还有两种方法,就是继承与javax.servlet.ServletRequestWrapper,javax.servlet.ServletResponseWrapper这两个类的子类即:HttpServletRequestWrapper和HttpServletResponseWrapper。

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics