《JSP2.0技术手册》读书笔记三-Filter

Filter,即过滤器了,很形象地说明了它的作用-在结果发生前获得控制做出相应操作,主要是改变一个请求或修改一个响应。具体运用情况如下:

1. 统一的认证处理。 2. 对用户的请求做检查、做更精确的记录。

3. 监视或对用户所传递的参数做前置处理。 4. 改变图像文件的格式

5. 对响应做编码的动作 6. 对响应做压缩处理

7. 对xml的输出使用xslt来转换

想要清楚地明白它在web应用中的位置和作用,就需要了解它的运作方式,下图较为形象:

由图可知:

1。一个响应或请求是经由过滤链层层转发的。一个Filter做完处理后,调用FilterChain.doFilter()来转送给其他Filter做处理。

2。Filter可以在request到达servlet或Jsp之前预处理请求,也可以在响应到达客户端前处理响应。

3。当客户端发出web资源请求时,web服务器根据web.xml设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的web资源处理。

补:Filter做完处理后一般使用FilterChain.doFilter()来让其他Filter继续过滤。但也可以调用RequestDispatcher的forward()、include()方法转发请求,RequestDispatcher对象可由HttpServletRequest.getRequestDispatcher(uri)得到。还可以使用HttpServletResponse的sendRedirect(uri)、sendError(int statusCode)或sendError(int statusCode,String msg)来做出相应。

Filter可以处理不同的请求,这需要在web.xml中设置,如下:

 

REQUEST:只有当用户直接对网页做出请求的动作时,通过此Filter。一般默认情况为REQUEST。

FORWARD:当用户的请求是通过RequestDispatcher.forward()方法时,通过此Filter。

INCLUDE:当用户的请求是通过RequestDispatcher.include方法时,通过此Filter。还必须把<url-pattern>改成<servlet-name>,意思是当请求从servlet-name指定的servlet发出并且通过requestdispatcher.include()时,才通过此Filter。

ERROR:当用户的请求是通过错误机制处理的时候,通过此Filter。

我们来了解下RequestDispatcher接口。通常可用获得一个requestDispatcher对象,封装由一个特定的URL定义的服务器资源。从客户端接收请求,然后发给服务器端的可用资源(servlet/JSP等)。通常是通过HttpServletRequest.getRequestDispatcher(uri)来获得具体对象。forward(request,response)方法用来从生成它的servlet向其他资源传递请求;include(request,response)方法用来包括发送给其他服务器端资源的响应的内容。

Filter的使用:

1. 所有过滤器都必须实现javax.servlet.Filter接口。此接口中方法有:

1.1 public void init(FilterConfig config):当Filter被加载时执行。FilterConfig可用获得web.xml定义的该过滤器的名字-config.getFilterName(),可以获得ServletContext对象、web.xml设定的过滤器初始参数(param-name,param-value)。

1.2 public void doFilter(ServletRequest,ServletResponse,FilterChain):可以对请求和响应做处理,然后调用filterChain.doFilter()将控制权传给下一个Filter。若此Filter已为过滤链中最后一个过滤器,则运行最初请求的servlet或jsp。

1.3 public void destroy():当doFilter执行完毕就会调用此方法,释放资源,一般不需要使用。

2. 在web.xml中配置此过滤器的过滤规则。

 

我们经常用过滤器来进行访问权限控制、编码处理等。下面就举一个最实用的例子,解决乱码!

        首先定义过滤器SetCharacterEncodingFilter,它是tomcat自带的一个类,可以在网上找到源代码,引入到项目中就可使用了,现贴出代码如下:

 

其次就是配置过滤规则了:

 

真是太舒服了!这比任何其他解决中文乱码问题的办法都有效简洁!

posted @ 2010-10-20 11:47  春文秋武  阅读(187)  评论(0编辑  收藏  举报