JavaEE-拦截器和过滤器

过滤器(Filter):

过滤器 JavaWeb 三大组件之一,它与 Servlet 很相似!过滤器是用来拦截请求的,而不是处理请求的。

当用户请求某个 Servlet 时,会先执行部署在这个请求上的 Filter,如果 Filter “放行”,那么会继承执行用户请求的 Servlet;如果 Filter 不 “放行”,那么就不会执行用户请求的 Servlet。

其实可以这样理解,当用户请求某个 Servlet 时,Tomcat 会去执行注册在这个请求上的 Filter,然后是否 “放行” 由 Filter 来决定。可以理解为,Filter 来决定是否调用 Servlet!当执行完成 Servlet 的代码后,还会执行 Filter 后面的代码。

一,拦截资源路径

1
@WebServlet("/*")   //以注解的形式

二,资源放行

1
filterChain.doFilter(servletRequest, servletResponse);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.example.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet("/*") //拦截所有资源路径
public class Filter implements javax.servlet.Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init filter");
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("正在拦截");
//资源放行
filterChain.doFilter(servletRequest, servletResponse);
}

@Override
public void destroy() {
System.out.println("destroy filter");
}
}

过滤器应用场景

1, 执行目标资源之前做预处理工作,例如设置编码,这种试通常都会放行,只是在目标资源执行之前做一些准备工作;

2,通过条件判断是否放行,例如校验当前用户是否已经登录,或者用户 IP 是否已经被禁用;

3,在目标资源执行后,做一些后续的特殊处理工作,例如把目标资源输出的数据进行处理;

监听器(Listen)

监听 ServletContext,HttpSession,ServletRequest 等域对象创建和销毁事件

监听域对象的属性发生修改的事件
监听 ServletContext,HttpSession,ServletRequest 等域对象创建和销毁事件

监听域对象的属性发生修改的事件

用途:

  • 统计在线人数和用户
  • 系统启动的时候加载初始化信息
  • 统计网站的访问量
  • 和 Spring 结合
  • 监听器分类:
    监听器分类:

(1)第一类:按照被监听的对象划分:ServletContext 域、ServletRequest 域、HttpSession 域。
(2)第二类:监听的内容划分:监听域对象的创建与销毁的监听域对象的属性变化的。

ServletContextListener

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package zzs.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

@WebListener
public class FirstServletContextListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("servletcontext初始化了");

}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("servletcontext销毁了");
}
}

HttpSessionListener

 监听 Httpsession 域的创建于销毁的监听器 HttpSessionListener。
  HttpSession 对象的生命周期:
  (1)创建:第一次调用 request.getSession 时创建。
  (2)销毁:服务器关闭销毁 session 过期手动销毁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package zzs.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;

@WebListener()
public class FirstHttpSessionListener implements HttpSessionListener {
public FirstHttpSessionListener() {
}
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session创建id:"+se.getSession().getId());
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session销毁");
}
}

ServletRequestListener

  ServletRequestlistener 监听 ServletRequest 域创建与销毁的监听器 ServletRequestListener
  ServletRequest 的生命周期
  (1)创建:每一次请求都会创建 request
  (2)销毁:请求结束