介绍
过滤器 ,过滤客户端发出来的请求。
浏览器发出, 然后服务器派servlet处理。
–> 在中间就可以过滤, 其实过滤器起到的是拦截的作用。
接口
(过滤请求和响应,于servlet之前运行)
● 作用
a. 对一些敏感词汇进行过滤
b. 统一设置编码(全栈编码)
c. 自动登录
d. 权限的设置
e. 处理会员参数(过滤广告)
404errorPage页面设置
如何使用Filter
–> 至少有个servlet
–> 编写一个java类,必须直接或间接的实现Filter接口 –> 主要实现doFilter方法
–> 使用注解方式,为虚拟路径配置过滤器
定义一个类, 实现Filter
public class FilterDemo implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println(“来到过虑器了。。。”);
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
注册过滤器
在web.xml里面注册,注册的手法与servlet基本一样。
FilterDemo
FilterDemo
com.itheima.filter.FilterDemo
FilterDemo
/*
Filter的生命周期
● 创建
在服务器启动的时候
● 销毁
服务器停止的时候
● doFilter
只要访问了Filter在服务器中配置的路径的时候
Filter执行顺序
- 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet
- 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。
- 多个Filter必须同类型
–> 要么全用注解方式
多个过滤器的顺序为自然顺序
–> 要么全用xml配置方式
书写顺序
Filter细节:
init方法的参数 FilterConfig
–> 获取filter在注册的名字 以及初始化参数。
–> 其实这里的设计的初衷与ServletConfig是一样的。
如果想放行,那么在doFilter 方法里面操作
–> 使用参数 chain,放行让请求到达下一个目标。
chain.doFilter(request, response);
–> 如果有多个过滤器,那么他们会按照注册的映射顺序执行(排队)
映射路径–url-pattern
如果是servlet –> 配置的是访问的路径 sevlet虚拟路径
如果是Filter –> 需要拦截的路径 Filter的映射路径
/* 写法格式与servlet一样。
a. 全路径匹配 以 / 开始
/LoginServlet
–> 若Filter采用精确匹配,只有访问路径与映射路径一模一样,才能拦截
b. 以目录匹配 以 / 开始 以 * 结束
/demo01/*
–> 如果Filter采用目录匹配,当访问路径是该映射路径的子集,就能拦截 过滤器中采用目录匹配
c. 以后缀名匹配 以 * 开始 以后缀名结束
.jsp .html *.do
请求转发的servlet会不会被过滤
–> 默认情况下,Filter只拦截request直接访问
针对 dispatcher 设置(可以多参数设置)
REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
FORWARD : 只要是转发都拦截。
ERROR : 页面出错发生跳转
INCLUDE : 包含页面的时候就拦截。
参数说明
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException
{
System.out.println(“执行过滤操作”);
// chain.doFilter(req, resp);
}
ServletRequest req –> 此次要进行了过滤的请求
ServletResponse resp –> 此次要进行了过滤的请求对应的响应
FilterChain chain –> 放行对象
–> 管理当前访问路径上的过滤器
–> 过滤链 对象
访问没有Filter –> 请求从浏览器到达服务器,根据请求路径/映射关系,找到对应servelt的service方法
访问有Filter –> 请求从浏览器到达服务器,根据请求路径/映射关系,不会立即运行servlet的service方法
而是经过该路径上的过滤器
底层:
创建一个FilterChain对象
对象中
public FilterChain(){
private Filters() filters;
}
根据配置文件或者注解中 配置的过滤路径,跟请求路径进行匹配
如果匹配上,将该Filter对象,放在数组中
执行过滤器链的doFilter方法
取出第一个Filter执行该Filter的doFilter方法—-
OK—–放行:chain.doFilter(request.response);
取出第二个Filter执行该Filter的doFilter方法—
OK—–放行:chain.doFilter(request.response);
——若所有执行都放行了,就访问Servlet
处理全栈中文乱码问题
配置web.xml
Filter编写