Filter【过滤器】
1.Filter简介
1.1Filter是web【三大】组件之一【Servlet&Listener】
- web组件共性
– 都需要实现某个接口
–都需要在web.xml中注册
1.2Filter作用
- Servlet作用:【处理】浏览器(客户端)与服务器之间的请求&响应
- Filter作用:【过滤】浏览器(客户端)与服务器之间的请求&响应
1.3Filter中常用的API
- FIlter接口:
– init():用于Filter初始化
–doFilter():作用与service()方法作用类似。是过滤请求和响应的。
–destory():用于Filter对象销毁。 - FilterChain接口:
–doFilter()方法,用于调用Filter链上的下一个构造器,如果当前过滤器是最后一个过滤器时,则将请求发送到目标资源。 - FilterConfig接口:
–getFilterName():获取FIlter名称
–getServletContext():获取ServletContext对象
– getInitParameter():获取Filter的初始化参数
–getInitParameterNames():获取Filter初始化参数的名称
2.Filter的工作原理
- 2.1浏览器发送请求【/UserServlet】,触发过滤器。
- 2.2执行过滤器中的相应方法【doFilter()】,放行此代码,过滤请求。
- 2.3放行请求:【chain.doFilter(request,response);】
- 2.4执行目标资源【Servlet】,处理请求,做出响应
- 2.5执行过滤器中的相应方法【doFilter()】,放行后代码,过滤相应
- 2.6响应
3.Filter声明周期
3.1Servlet
- 构造器
–执行时机:在第一次接收请求时,执行
–执行次数:在整个声明周期中,只执行一次 - init()
–执行时机:在第一次接收请求时,构造器执行之后,执行
–执行次数:在整个声明周期中,只执行一次 - service()
–执行时机:在每次接收请求时,执行
–执行次数:在整个生命周期中,执行n次。【n>=1】 - destroy()
–执行时机:在关闭或重启服务器时,执行
–执行次数:在整个声明周期中,执行一次。
3.2+Filter
- 构造器
–执行时机:在启动服务时,执行
–执行次数:在整个生命周期中,只执行一次 - init()
–执行时机:在启动服务时,构造器执行之后,执行
–执行次数:在整个生命周期中,只执行一次 - doFilter()
–执行时机:每次请求触发Filter时【请求Filter-Url】,执行
–执行次数:在整个生命周期中,执行n次。【n>=1】 - destroy()
–执行时机:在关闭或重启服务器时,执行
–执行次数:在整个声明周期中,执行一次。
4.多个Filter工作原理【重点】
- 4.1浏览器发送请求,【/UserServlet】,触发过滤器
- 4.2执行【过滤器1】中的相应方法【doFilter()】,放行前代码,过滤请求
- 4.2执行【过滤器1】中的相应方法【doFilter()】,放行前代码,过滤请求
- 4.3放行请求【chain.doFilter(request,response);】
- 4.4执行目标资源【Servlet】,处理请求,做出响应
- 4.5执行【过滤器2】中相应方法【doFilter()】,放行后代码,过滤响应
- 4.5执行【过滤器1】中相应方法【doFilter()】,放行后代码,过滤响应
- 4.6响应
注意:Filter的执行顺序由Filter的加载顺序决定,Filter的加载顺序由web.xml中【】的配置顺序决定。
5.Filter中URL的配置规则【重点】
5.1精确匹配
- /路径1/路径2/…/资源路径,如:
<filter-mapping>
<filter-name>MySedFilter</filter-name>
<url-pattern>/UserServlet</url-pattern>
</filter-mapping>
- 通过名称匹配,如:
<filter-mapping>
<filter-name>MySedFilter</filter-name>
<servlet-name>UserServlet</servlet-name>
</filter-mapping>
5.2模糊匹配【路径带*的匹配】
- 目录匹配:/路径/…/*,匹配【当前路径下】的所有资源
<filter-mapping>
<filter-name>UrlTestFilter</filter-name>
<url-pattern>/pages/*</url-pattern>
</filter-mapping>
- 后缀匹配:*.后缀名,匹配【任意路径下的指定后缀名】资源。
<filter-mapping>
<filter-name>UrlTestFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
注意:后缀匹配的“”,只能书写在首位【最前面】,不能在“”前面添加任何内容。“*”可以书写在url的最前面,或书写在url的最后面,不能书写在中间位置。
代表当前项目下的所有资源
<url-pattern>/*</url-pattern>
6.HttpFilter
6.1为什么谈HttpFilter?
因为在学习Servlet中,我们发现,最终创建Servlet的方式【继承HttpServlet】。所以,Fiter的最终实现,最好也存在HttpFilter。但在Tomcat底层源码中,并未提供HttpFilter()
6.2手动搭建HttpFiter
- 提供一系列获取常用对象的方法,便于子类中的直接使用
- 将doFilter()方法抽象化,在子类中重写doFilter方法。
- 将doFilter()方法重载,类型转换入。【ServletRequest->HttpServletRequest】
- 示例代码
private FilterConfig filterConfig;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// chain.doFilter(req, resp);
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
doFilter(request,response,chain);
}
/**
*
* @param req
* @param resp
* @param chain
* @throws ServletException
* @throws IOException
*/
public abstract void doFilter(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException ;
public void init(FilterConfig config) throws ServletException {
filterConfig = config;
}
/**
* 获取FilterConfig对象
* @return
*/
public FilterConfig getFilterConfig() {
return filterConfig;
}
/**
* 获取ServletContext对象
* @return
*/
public ServletContext getServletContext(){
return filterConfig.getServletContext();
}
Listener监听器
1.Listener简介
- Listener是服务器三大组件之一【Servlet&Filter】
- Listener主要用于【监听】web应用中对象及对象中的属性变化【创建、修改及销毁】等情况。
2.Listener作用
2.1生活中的监听器-狗仔
- 监听者:狗仔
- 监听对象:明星
- 监听事件:绯闻等各种瓜
- 监听结果:拿钱or头条热搜见
2.2 程序中的监听器
- 监听者:程序员创建
- 监听对象:ServletContext、HTTPSession、HTTPSessionRequest等
- 监听事件:对象的创建、销毁、属性变化等
- 监听结果:项目需求
3.Listener基本使用
- 3.1实现某个接口
- 3.2在web.xml中注册
<listener>
<listener-class>com.atguigu.listener.ApplicationTestListener</listener-class>
</listener>
总结Web三大组件
- web三大组件的加载顺序:Listener > Filter > Servlet