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” 的书写顺序来定的
设置所有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---的主要内容,如果未能解决你的问题,请参考以下文章