Servlet、Listener、Filter是web的三大组件。
1.Filter
概述
- web中的过滤器:当访问服务器中的资源时,过滤器可以将请求拦截下来,完成特殊的功能。
- 过滤器的作用:一般用于完成通用的操作。如登陆验证,统一编码处理,敏感字符过滤等...
快速入门
- 步骤:
1. 定义一个类,实现接口Filter
2. 重写方法
3. 配置拦截路径
@WebFilter("/*") // 配置拦截路径,访问服务器所有资源前都会执行该拦截器
public class FilterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截器执行...");
// 对于request对象的请求消息增强
// 放行
filterChain.doFilter(servletRequest, servletResponse);
// 对于response对象的响应消息增强
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
- 配置拦截路径同样有两种方式
1. web.xml文件配置
<filter>
<filter-name>filterDemo</filter-name>
<filter-class>FilterDemo</filter-class>
</filter>
<filter-mapping>
<filter-name>filterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. 注解配置
@WebFilter(value = "xxx")
过滤器生命周期方法
- init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,用于加载资源
- doFilter:每一次请求被拦截资源时,会执行。可以执行多次
- destroy:在服务器关闭后,Filter对象会被销毁。如果是服务器正常关闭,则会执行destroy方法。只执行一次,用于释放资源。
过滤器配置详解
- 拦截路径配置
1. 具体资源路径:比如/index.jsp,表示只有访问index.jsp这个资源时,过滤器才会被执行
2. 拦截目录:/user/*,表示访问/user目录下的所有资源时,过滤器都会被执行
3. 后缀名拦截方式:*.jsp,表示访问所有后缀名为jsp的资源时过滤器都会被执行
4. 拦截所有资源:/*,表示访问所有资源时,过滤器都会被执行
- 拦截方式配置:资源被访问的方式
1. 注解配置
设置dispatcherTypes属性,其值有5种:
1. REQUEST:默认值,浏览器直接请求资源
2. FORWORD:转发访问资源
3. INCLUDE:包含访问资源
4. ERROR:错误跳转资源
5. ASYNC:异步访问资源
示例:
// DispatcherType.REQUEST表示浏览器直接访问index.jsp资源时,该过滤器才会被执行
// 转发访问index.jsp资源,该过滤器不会被执行
@WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST) // 配置拦截路径,访问服务器所有资源前都会执行该拦截器
2. web.xml配置:配置dispatcher标签的值
<filter>
<filter-name>filterDemo1</filter-name>
<filter-class>com.nrvcer.web.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>filterDemo1</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
过滤器链(配置多个过滤器)
- 执行顺序:如果有两个过滤器:过滤器1和过滤器2
- 过滤器1
- 过滤器2
- 资源执行
- 过滤器2
- 过滤器1
@WebFilter(value = "/*")
public class FilterDemo1 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo1执行了");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("FilterDemo1回来了");
}
}
@WebFilter(value="/*")
public class FilterDemo2 implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo2执行了");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("FilterDemo2回来了");
}
}
- 过滤器先后顺序问题
1. 对于注解配置:按照类名的字符串比较规则比较,值小的先执行。比如AFilter和BFilter,先执行AFilter
2. 对于web.xml配置:<filter-mapping>谁先定义在上边,谁先执行
案例:
- 登录校验器
- 过滤敏感词汇
2.Listener
概述
- 概念:web的三大组件之一
- 事件监听机制
1. 事件:一件事情
2. 事件源:事件发生的地方
3. 监听器:一个对象
4. 注册监听:将事件,事件源,监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
ServletContextListener接听器
- 方法
1. contextDestroyed(ServletContextEvent sce):ServletContext对象被销毁之前调用该方法(服务器正常关闭后该方法被调用)
2. contextInitialized(ServletContextEvent sce):ServletContext对象创建后调用该方法(服务器启动后该方法被调用)
- 步骤
1. 定义一个类,实现ServletContextListener接口
2. 重写方法
3. 配置(两种方式)
1. 配置web.xml
<listener>
<listener-class>com.nrvcer.listener.ContextLoadListener</listener-class>
</listener>
2. 注解配置
@WebListener