文章目录
过滤器Filter
Filter概述
Filter(过滤器)是Java Web开发的三大组件之一(Servlet Filter Listener)
一般用于对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理
最常用与解决乱码问题(配置全局拦截器,拦截所有请求,给request和response都设置编码,然后放行)
Filter过滤器生命周期
- init方法:服务器启动时就创建该Filter对象,执行init()方法
- doFilter方法:每当一个请求的路径是满足过滤器的配置路径,那么就会执行一次过滤器的doFilter()方法
- destory方法:服务器关闭的时候销毁Filter,执行destory()方法
Filter执行流程
- 浏览器发送请求,tomcat服务器将http请求转成request对象,http响应转response对象
- 通过访问url的地址查找,找到对应的Filter过滤器将request,resposne传给它的doFilter()方法
- 处理之后调用chain.doFilter(request,response)方法(放行,如果没有放行,则直接响应给浏览器,不继续往下执行)
- chain.doFilter()放行之后,找到对应的html、jsp、servlet,然后进行处理
- 处理完成之后将response返回给Filter,然后Filter执行后面的代码(doFilter()方法里面的)
- 执行完剩余代码之后,将reponse响应给 浏览器
doFilter()方法的内部执行顺序:
- 先执行doChain之前的代码,再执行doChain方法放行
- 再执行Servlet的doGet/doPost或者jsp、html代码
- 最后执行doChain之后的代码
Filter过滤器链 - 多个过滤器的执行流程(一路执行,再原路返回)
多个 Filter 过滤器都对同一个 URL 进行拦截,这些 Filter 就会组成一个Filter 链,Filter 链用 FilterChain 对象表示。
会依次调用过滤器处理,当过滤器有chain.doFilter(request,response)放行才会继续往后面的过滤器执行,否则返回响应。
执行顺序是:
浏览器 --> doFilter_1(chain.doFilter()方法) --> doFilter_2(chain.doFilter()方法) --> … --> doFilter_n(chain.doFilter()方法) --> 找到资源(Servlet,jsp,html等 ) --> doFilter_n剩余部分 --> … --> doFilter_2剩余部分 --> doFilter_1剩余部分 --> 最后响应给浏览器
Filter过滤器url-pattern路径匹配方式
1:完全路径匹配(名称完全相同才行)
@WebFilter("/user")
@WebFilter("/user/hello")
2:目录匹配(满足目录下的所有文件都匹配)
@WebFilter("/*")
@WebFilter("/user/*")
3:扩展名匹配(后缀扩展名相同就匹配)
@WebFilter("*.html")
@WebFilter("*.jsp")
Filter过滤器dispatcher属性【**】
- REQUEST:默认值,代表直接通过url地址访问某个资源时执行对应的Filter(重定向)
- FORWARD:通过请求转发的时候执行对应的Filter
【dispatcher属性为默认值REQUEST的时候,就算url匹配,对应的Filter也是不会拦截 请求转发到这个url的方式】
@WebFilter(value = "/index.jsp",dispatcherTypes={
DispatcherType.REQUEST,DispatcherType.FORWARD})
Filter案例 - 解决乱码问题 (一般Filter也是用于这个)
// 拦截所有请求,对所有请求的request、response做编码设置
@WebFilter("/*")
public class CharSetFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1、设置request、response编码
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
//2. 放行request和response
chain.doFilter(req, resp);
}
}
监听器Listener
监听器Listener概述
- 监听器Listener是用来监听域对象(域对象ServletContext,HttpSession和ServletRequest【也就是监听的数据源】)
- 监听哪个域就实现对应的接口就行
监听器类型
- 监听域对象自身的创建和销毁的事件监听器。
- 监听域对象中的属性的增加和删除的事件监听器。
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
特点:
- 不需要监听地址(不需要写路径,只需要注解 @WebListener() 表示这是一个监听器就行)