Filter过滤器
概念:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能(响应同样又会被拦截)
用途:登录验证、统一编码处理、敏感词过滤等
Filter快速入门
>>> 配置拦截路径有两种方式:web.xml / 注解 (这里使用注解,比较方便)
@WebFilter("/*")
public class DemoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("服务器启动后,创建Filter对象————init方法用于加载资源,执行一次");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("我去了!———— 对request请求消息增强");
filterChain.doFilter(servletRequest, servletResponse); // (★)放行
System.out.println("我又回来了!———— 对response响应消息增强");
}
@Override
public void destroy() {
System.out.println("服务器正常关闭,销毁Filter对象————destroy方法用于释放资源,执行一次");
}
}
<!-- 补充一下xml配置方式 (和Servlet一样,熟悉的两层映射,自定义名称作为过渡) -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>DemoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter细节
▌过滤器执行流程
- 放行前的代码
- 放行,执行资源
- 放行后的代码
▌过滤器生命周期
和Servlet一样,方法对应着其生命周期:init → doFilter → destroy
▌过滤器配置详解(拦截路径)
拦截具体资源 | /index.jsp |
拦截所有资源 | /* |
目录拦截 | /loli/* |
后缀名拦截 | *.jsp (开头不加斜杠) |
▌过滤器配置详解(拦截方式)
设置dispatcherTypes[ ]属性值 | |
---|---|
REQUEST | (默认值)浏览器直接请求资源 |
FORWARD | 转发访问资源 |
INCLUDE | 包含访问资源 |
ERROR | 错误跳转资源 |
ASYNC | 异步访问资源 |
▌过滤器链
代码执行顺序:过滤器1 → 过滤器2 → 执行资源 → 过滤器2 → 过滤器1
过滤器顺序:
- 注解配置:类名按照字符串比较规则进行比较。比如AFilter先于BFilter。
- web.xml配置:
<filter-mapping>
谁定义在上边,谁先执行
Filter经典案例
补充知识点:Listener监听器
▶ 概述:web三大组件(Servlet,Filter,Listener)
▶ 概念:
- 和JS类似的:事件源,事件,监听器(
btn.addEventListener("click", function(){})
) - 注册监听:事件源发生指定事件后,触发监听器,执行相应代码(如上)
▶ Servlet三大域分别被三个监听器监听:ServletContextListener, HttpSessionListener, ServletRequestListener
▶ 下面着重介绍ServletContextListener监听器
1.定义一个类实现ServletContextListener接口
2.复写方法
3.配置(xml / 注解)
// 这里是空的,因为监听的事件源就是接口对应的三大域之一
@WebListener()
public class DemoListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象创建之后自动调用该方法");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象销毁之前自动调用该方法");
}
}
End ♬
by a Lolicon ✪