JavaWeb---过滤器Filter---

Posted 夏小弥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb---过滤器Filter---相关的知识,希望对你有一定的参考价值。

过滤器Filter


过虑器简介:

过虑器能对客户的请求进行预先处理,然后再将请求转发给其他web组件。
过虑器是在Servlet2.3规范中定义的,它可以对Web组件的,ServletRequest和ServletResponse进行检查和修改。
过虑器本身并不生成ServletRequest对象和ServletResponse对象,它只对web组件提供以下过虑功能:
在web组件调用之前检查request,并修改请求头和请求正文。
过虑器能够在web组件被调用之后检查response对像,修改响应头和响应正文。


过虑器的过虑过程:



创建自定义的过虑器:

自定义的过虑器必须实现:javax.servlet.Filter接口。此接口定义了以下三个方法:
Init(FilterConfig conf) – 过虑器的初始化方法。-初始化工作执行一次(启动时)。
doFilter(ServletRequest,ServletResponse,FilterChain) – 此方法完成实际的过虑操作。只要是配置的url匹配此过虑器的配置,即执行此方法。
destroy()-Servlet窗口在销毁过虑器时执行此方法。-销毁工作也只执行一次。


QUICK-START:

用过虑器实现请求字符集的设置:
第一步:实现Filter类。
第二步:在doFilter方法中书写代码。
第三步:在Web.xml中配置过虑器。


也可以在doFilter方法,设置response的响应头信息。设置好之后再其他的Servlet中就不用再设置响应头了,如下:
response.setContentType(“text/html;charset=UTF-8”);


发布过虑器:



将字符集配置到过虑器的初始化参数中:



Filter的一些小细节:

doFilter方法中的chain.doFilter(r,p);不能忘记写,否则转不到目录页面。此方法的功能是将请求转到下一个过虑器链。
在doFilter方法中,接收是与HTTP协议无关的request和response,要想使用session,必须进行强制类型转换,即 : (HttpServletRequest)servletRequest.
在web.xml中配置的url-pattern通常以/开头,但也可以以*.do这样的形式加以定义。


配置说明:

过虑器的配置:以下几乎是所有单位的标准配置

<filter>
  <filter-name>autoLoginFilter</filter-name>
  <filter-class>cn.itcast.autologinfilter.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>autoLoginFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
filter-name是过虑器的名称
filter-class是过虑器的类文件
init-param是过虑器的初始化参数。
param-name – 是参数名。
param-value - 是参数值。
filter-mapping是过虑器的映射信息。
url-pattern-是需要过虑的资源url.


Filter-mapping子的元素:
对于一个<filter/>元素,可以设置多个filter-mapping对应的元素。
<serlvet-name/>如果不配置<url-pattern/>元素,也可以通过配置<serlvet-name/>元素的形式设置需要拦截的Servlet。
<dispatcher/>元素:可以为FORWARD- INCLUDE- REQUEST(默认)- ERROR之一。指定需要拦截的Servlet的请求试。

<filter-mapping>
	<filter-name>jspcache</filter-name>
	<url-pattern>*.jsp</url-pattern>
	<url-pattern>*.html</url-pattern>
	<servlet-name>login</servlet-name>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>ERROR</dispatcher><!– 必须要在web.xml中配置error-page信息才可以拦截 -- >
	<dispatcher>INCLUDE</dispatcher>
	<dispatcher>FORWARD</dispatcher><!– 应该添加此配置 -- >
</filter-mapping>


过滤器技术要点:
            1)可以拦截(在前端页面与servlet之间进行)
            2)可以拦截服务器中的任意资源(jsp,html,jpg,servlet)
            3)该拦截不影响访问速度,而且可以放置多个过滤器
            4)优先级高于servlet,请求时先执行filter,响应时后执行filter
            5) 有关路径的说明:
                /*   拦截项目下的所有资源
                *.jsp  拦截所有的jsp页面
                /jsps/*  拦截jsps目录下的所有资源
                /buy/*   拦截buy目录(注意,不一定是真实文件夹,这里指的是路径中的一段)下的所有资源
                /LoginServlet 只拦截该servlet
                login    只拦截名为“login”的servlet
                
                /jsps/*.jsp  ----非法路径,因为里面要求类似“*.jsp”这样的格式只能放在开头,不能放在后面
            6)如果配置了多个过滤器,它们的先后位置(从前端到后台方向的先后顺序)是以“filter-mapping” 的书写顺序来定的 


Filter的应用:
设置所有jsp页面不缓存:
开发步骤:
1、书写一个Filter,在其doFilter方法中添加以下代码:

HttpServletResponse resp = (HttpServletResponse)response;
resp.setHeader("expires","-1");
resp.setHeader("pragma", "no-cache");
resp.setHeader("cache-control","no-cache");<pre name="code" class="java">chain.doFilter(request, resp);//注意是已经强转了的对像

 2、将Filter配置到web.xml中。配置如下: 

<filter>
<filter-name>jspcache</filter-name>
<filter-class>cn.itcast.filter.JspPageFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>jspcache</filter-name>
  <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
3、打开ie,清空所有Cookie的临时文件。
4、访问本项目的jsp页面,看缓存中是否有临时文件。
5、将Filter的配置删除,然后再去看是否会出现临时文件。



以上是关于JavaWeb---过滤器Filter---的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb_Filter过滤器篇

JavaWeb_Filter过滤器篇

javaweb-Servlet过滤器Filter

JavaWeb的过滤器Filter

JavaWeb--Filter(过滤器)学习

javaweb学习总结(四十六)——Filter(过滤器)常见应用