1.定义
Filter的翻译就是过滤器,可以认为它是一种加强版的Servlet。
几种常见Filter:
1. 用户授权Filter。用于检查用户请求,根据请求过滤用户非法请求。
2. 日志Filter。用于记录某些特殊的用户请求。
3. 解码Filter
4. 改变XML内容的XSLT Filter
2. Filter作用
- 对用户请求进行预处理:在HttpServletRequest到达Servlet之前进行拦截和修改。
- 对HttpServletResponse进行后处理:在HttpServletResponse到达客户端之前进行拦截和修改。
- 对用户请求生成响应(很少这么用)
3.创建 Filter
1. 创建Filter处理类
package com.zrgk.servlet;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//通过注解方式配置,不需要在web.xml中再配置
@WebFilter(filterName="log",urlPatterns={"/*"})
public class MyFilter implements Filter {
@Override
public void destroy() {
//在Filter销毁前,对某些资源进行回收
}
//过滤所有请求:对每个请求和响应进行额外处理
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
//转换成HttpServletRequest请求,可多一些处理方法
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
//设置所有路径都支持跨域请求
response.setHeader("Access-Control-Allow-Origin", "*");
//打印记录访问路径
System.out.println("访问路径是:"+request.getServletPath());
//放行。Filter是链式处理,只有放行后,才能继续往后执行
//执行该方法前,是对用户请求进行预处理
//执行该方法后,是对服务器响应进行后处理
//说明chain.doFilter(...);后面的代码要在服务器生成响应后才能执行
chain.doFilter(req, resp);
System.out.println("放行后,还可执行后面的代码");
}
@Override
public void init(FilterConfig arg0) throws ServletException {
//用于完成对Filter的初始化
}
}
注:要拦截多个URL时,使用模式字符串来拦截。
2. web.xml文件中配置Filter
若不是采用的注解方式创建Filter就得在web.xml当中配置如下代码:
<!-- 定义Filter -->
<filter>
<!-- Filter名字,相当于@WebFilter的filterName属性 -->
<filter-name>log</filter-name>
<!-- Filter实现类 -->
<filter-class>com.zrgk.servlet.MyFilter</filter-class>
</filter>
<!-- 定义Filter拦截的URL -->
<filter-mapping>
<!-- Filter名字 -->
<filter-name>log</filter-name>
<!-- 要拦截的URL,相当于指定@WebFilter的urlPatterns属性 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
4.Filter注解(@WebFilter)的常用属性
属性 | 说明 |
---|---|
asyncSupported | 指定该Filter是否支持异步操作 |
dipatcherTypes | 指定该Filter仅对哪种dispatcher模式的请求进行过滤。该属性支持ASYNC、ERROR、FORWORD、INCLUDE、REQUEST这5个值的任意组合,默认同时过滤这5种。 |
displayName | 指定该Filter的显示名字 |
filterName | 指定该Filter的名称 |
initParams | 为该Filter配置参数 |
servletNames | 指定该Filter对哪些Servlet执行过滤,可多个值。 |
urlPatterns/value | 指定要拦截的URL。这两个属性作用是一样的。 |
5.Filter与Servlet比较
- 实际上,Filter只是在doFilter()方法里比Servlet多了个FilterChain类型的参数,该参数控制是否放行用户请求。
- 获取Filter初始化参数使用FilterConfig的getInitParameter()方法
- Filter和Servlet具有完全相同的生命周期
- Filter也可通过
<init-param.../>
或@WebFilter的initParams来配置初始化参数。代码片:
@WebFilter(
filterName="log",
urlPatterns={"/*"},
initParams={
@WebInitParam(name="encoding",value="GBK"),
@WebInitParam(name="loginPage",value="/login.jsp")
}
)
public class MyFilter implements Filter {
//略.......
}
6. 使用URL Rewrite实现网站静态
- 大部分搜索引擎优先考虑收录静态HTML页面,而不是这种动态的
*.jsp、*.php
页面 - 实现网站伪静态思路:通过Filter拦截所有发向*html的请求,然后将请求按某种规则forword(转发)到实际的
*.jsp
页面。 - 需要下载urlrewriterfilter-4.0.3.jar包
- web.xml中配置:
<filter>
<filter-name>UrlReWriterFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlReWriterFilter</filter-name>
<!-- 拦截所有的URL -->
<url-pattern>/*</url-pattern>
</filter-mapping>
- 在WEB-INF路径下添加一个urlrewrite.xml文件来定义伪静态映射规则:
<urlrewrite>
<rule>
<!-- 所有配置如下正则表达式的请求 -->
<form>/userinf-(\w*).html</form>
<!-- 转发到如下页面,$1代表上面第一个正则里所匹配的字符串 -->
<to type="forword">/userinf.jsp?username=$1</to>
</rule>
</urlrewrite>
所以请求userinf-XXX.html页面都会转发到userinf.jsp页面。