一、过滤器(Filter)
过滤器是JavaWeb的三大组件之一。
JavaWeb三大组件:
Servlet | 运行在服务器端处理请求生成响应 |
---|---|
过滤器 | 对所请求的Web资源进行拦截,在请求到达目标资源之前调用过滤器进行一个处理(前置处理),在目标资源访问后也可以调用过滤器进行后置处理 |
监听器 | 监听器是用来监听servletContext, session , request 三个域对象的创建,销毁以及属性改变事件,当域对象发生以上事件时,监听器就自动监听到,从而自动执行相关方法 |
1.1 创建Filter
创建一个类,实现Filter接口,该类就是一个过滤器
@WebFilter(value = "/*")
public class FilterDemo01 implements Filter {
//初始化方法:当过滤器创建后执行
public void init(FilterConfig config) throws ServletException {
}
//销毁方法:当过滤器销毁前执行
public void destroy() {
}
//核心方法:当访问被过滤器拦截的资源时,自动调用doFilter方法进行请求前的处理或响应后的处理
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//放行资源
chain.doFilter(request, response);
}
}
1.2 拦截原理
Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪些web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,所以我们可以在doFilter方法中编写代码来达到以下目的:
-
访问目标资源之前,让一段代码执行
-
决定是否调用目标资源(即是否放行)
chain.doFilter(request, response);//表示放行资源
-
调用目标资源之后,让一段代码执行
1.3 过滤器链(FilterChain)
在doFilter方法的参数中有一个FilterChain对象,FilterChain就是过滤器链。在JavaWeb应用中可以编写多个过滤器,这些Filter组合起来称之为一个FilterChain。
1.3.1 过滤器的执行顺序
-
在web.xml中注册方式: web服务器根据Filter在web.xml文件或注解中的注册顺序,决定先调用哪个Filter。
-
注解方式: 如果过滤器使用注解注册的,则过滤器的执行顺序是根据过滤器的类名来决定的。
注意:
过滤器的注解
@WebFilter(filterName = "FilterDemo01")
中的filterName不影响过滤器的执行顺序。
1.4 拦截路径配置(在注解中配置)
@WebFilter(value = "拦截方式")
或 @WebFilter("拦截方式")
精确拦截 | /index.jsp | 只拦截index.jsp |
---|---|---|
目录拦截 | /user/* | 拦截user目录下的所有资源 |
后缀名拦截 | *.jsp | 拦截所有后缀名为jsp的资源 |
拦截所有资源 | /* | 所有资源都被拦截 |
二、监听器(Listener)
监听器是用来监听servletContext, session , request 三个域对象的创建,销毁以及属性改变事件,当域对象发生以上事件时,监听器就自动监听到,从而自动执行相关方法。
域对象 | 作用范围 |
---|---|
servletContext | 整个web应用,多个会话可共享servletContext对象中的数据 |
session | 一次会话,多个请求可共享session的数据 |
request | 一次请求,当请求结束了就自动销毁了 |
所有的域对象都有共同的方法:
setAttribute(String name,Object value)
: 存储数据,name是属性名(key)
getAttribute(String name)
: 根据属性名称获取值
removeAttribute(String name)
: 根据属性名删除该属性
2.1 监听器的分类
ServletContext监听:
监听器名称 | 作用 |
---|---|
ServletContextListener | 监听Servlet对像的创建和销毁 |
ServletContextAttributeListener | 监听Servlet对像中属性的增删改属性 |
Session监听:
监听器名称 | 作用 |
---|---|
HttpSessionListener | 监听Session对象的创建和销毁 |
HttpSessionAttributeListener | 监听Session对象中属性的增删改属性 |
HttpSessionBindingListener | 监听Session对象的绑定和解除 |
HttpSessionActivationListener | 监听Session数据的钝化和活化 |
Request监听:
监听器名称 | 作用 |
---|---|
ServletRequestListener | 监听Request对象的创建和销毁 |
ServletRequestAttributeListener | 监听Request对象中属性的增删改属性 |
2.2 自定义监听器
创建一个类,实现一个类型的监听器
@WebListener
public class ListenDemo01 implements HttpSessionListener {
//当session创建后执行
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session对象创建了。。。");
}
//当session销毁前执行
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session对象销毁了。。。");
}
}