一:简介
过滤器是在Servlet2.3规范中定义的,它能够对客户端请求进行预处理,也可以对response进行后处理,然后再将请求转发给其他web组件,是个典型的处理链。
过滤器的过滤过程:
Filter有以下几个种类:
1).用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。
2).负责解码的Filter:包括对非标准编码的请求解码。
3).日志Filter:详细记录某些特殊的用户请求。
实现:
1)
写一个类实现
Filter
接口
,
在
doFilter
方法中写功能代码
public class Filter1 implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("before");
chain.doFilter(request, response);
System.out.println("after");
2)
在
web.xml
中配置
Filter
拦截的资源路径
<filter-name>filter1</filter-name>
<filter-class>cn.itcast.filter.Filter1</filter-class>
<filter-name>filter1</filter-name>
<url-pattern>/*</url-pattern>
Filter与Servlet:
Filter就像一个加强版的Servlet,它具有servlet的所有功能,还多了个放行功能。
Servlet在第一次使用时被加载,Filter在应用启动时被加载。
生命周期:
Web容器启动时会读取web.xml文件,将所有的Filter初始化,此时filter的init方法会执行。
当拦截到客户端请求时会执行doFilter方法。
Filter对象创建后会驻留内存,当web应用移除或服务器停止时将被销毁。
获得初始化参数
在
web.xml
文件中为
Filter
配置初始化参数
<param-name>name</param-name>
<param-value>xxxx</param-value>
public void init(FilterConfig filterConfig) throws ServletException {
String name = filterConfig.getInitParameter("name");
拦截html页面
1)文件缓存
由于html页面的url是没有在web.xml文件中配置的,所以服务器会调用tomcat的DefaultServlet,在DefaultServlet中会检查文件的修改时间,如果没有修改则发送304头,这样会导致过滤器也被缓存。
解决办法:
在放行前书写以下代码:
HttpServletResponse resp = (HttpServletResponse)response;
resp.setHeader("expires","-1");
resp.setHeader("praqma","no-cache");
resp.setHeader("cache-control","no-chache");
2).Html页面乱码
在filter和html页面中指定的编码为utf-8,这样会导致html乱码,原因是html页面数据是通过DefaultServlet发送,而DefaultServlet默认是使用的gbk编码。
解决办法:
修改tomcat下的web.xml文件,找到DefaultServlet的配置,加入初始化参数:
<init-param>
<param-name>fileEncoding</param-name>
<param-value>utf-8</param-value>
</init-param>
Filter配置:
1).通过web.xml配置
<filter>
<fileter-name>autoLogin</filter-name>
<filter-class>com.malongbo.filter.AutoLogin</filter-class>
</filter>
<filter-mapping>
<filter-name>autoLogin</filter-name>
<url-pattern>/*</filter-class>
</filter-mapping>
说明:
filter-name:过滤器的名字
filter-class:过滤器的类文件
init-param:过滤器的初始化参数
param-name:参数名
param-value:参数值
dispatcher:拦截方式
有四种方式:(缺省为REQUEST)
REQUEST:拦截直接的请求方式
INCLUDE:拦截页面包含的访问方式
FORWARD:拦截请求转发的访问方式
ERROR:拦截出错页面的访问方式
2).通过Annotation进行配置(在Servlet3.0规范中)
@WebServlet 主要属性列表
属性名 |
类型 |
描述 |
name |
String |
指定 Servlet 的 name 属性,等价于 <servlet-name>。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。 |
value |
String[] |
该属性等价于 urlPatterns 属性。两个属性不能同时使用。 |
urlPatterns |
String[] |
指定一组 Servlet 的 URL 匹配模式。等价于 <url-pattern> 标签。 |
loadOnStartup |
int |
指定 Servlet 的加载顺序,等价于 <load-on-startup> 标签。 |
initParams |
WebInitParam[] |
指定一组 Servlet 初始化参数,等价于 <init-param> 标签。 |
asyncSupported |
boolean |
声明 Servlet 是否支持异步操作模式,等价于 <async-supported> 标签。 |
description |
String |
该 Servlet 的描述信息,等价于 <description> 标签。 |
displayName |
String |
该 Servlet 的显示名,通常配合工具使用,等价于 <display-name> 标签。 |
下面是一个简单的示例:
@WebServlet(urlPatterns = {"/simple"}, asyncSupported = true,
loadOnStartup = -1, name = "SimpleServlet", displayName = "ss",
initParams = {@WebInitParam(name = "username", value = "tom")}
)
public class SimpleServlet extends HttpServlet{ … } |
过滤器Filter主要功能是:1、完成安全检查;2、重新格式化请求首部或体;3、建立请求审计或记录日志---请求过滤器Filter
1、压缩响应流;2、追加或者修改响应流;3、创建一个定制响应---响应过滤器Filter