Filter

image.png
Filter通常写一些通用代码,因为客户端和服务端交互都要通过Filter

Filter 使用

Filter和Servlet使用方法基本相同
image.png

  1. 实现类,实现Filter接口,重写方法,其中init()和destroy()生命周期方法

image.png
image.png

  1. 配置Filter拦截资源的路径:在类上定义@WebFilter注解

image.png

  1. 在doFilter方法上输出一句话测试,使用FilterChain放行

· image.png
image.png

Filter 执行流程

image.png
执行逻辑
image.png
1. 执行放行前逻辑
image.png
2. 访问资源逻辑
image.png
3. 执行放行后逻辑
image.pngimage.png

执行思路

执行Filter过滤器request有数据,response没有数据

  1. 放行前执行是对request数据进行处理
  2. 使用FilterChain执行放行,获得reponse数据
  3. 放行后对response数据处理

    Filter 拦截路径配置

    image.png
    @WebFilter(“xxx”) 配置的路径是拦截路径
    image.png
    配置拦截hello.jsp后拦截器Filter生效
    访问其他网页拦截器不生效
    image.png

    Filter 过滤器链

    image.png
    配置两个过滤器,同时配置过滤所有路径@WebFilter(“/*”)

  4. 执行逻辑先执行第一个过滤器

  5. 然后放行
  6. 在执行第二个过滤器然后方形到资源路径
  7. 访问资源路径后回到第二个过滤器
  8. 最后访问第一个过滤器

image.png
image.png
image.png
控制台输出
image.png
Filter过滤器链执行顺序
image.png
类似A-Z排序

登录验证

image.pngimage.png
在登录的servlet中判断用户登录是否登录,登录页面将用户存在session,通过session判断是否存在

  1. 登录则使用FilterChain放行
  2. 如果没有登录则给出信息并跳转登录页面
  3. 筛选器应该在登陆前做有关登录资源筛选

image.png
代码实现:

  1. 创建对应的filter包下创建LoginFilter类

image.png

  1. 在对应的LoginFliter写方法
    1. 使用@WebFilter(“/*”)拦截所有路径
    2. 对Session的User进行判断
      1. 因为Servlet的reques(ServletRequest)t和Filter的request(HttpServletRequest)不同需要强行转换

HttpServletRequest req = (HttpServletRequest) request;

  1. 2. 如果登录则放行,不登陆则设置信息跳转到登录页面
  1. 在对获取的路径以及Session进行判断
    1. 对拦截的相关的登录路径资源进行遍历并放行
    2. 使用return直接返回方法不进入下面的判断

image.png

Listener

image.png

Applacation监听

ServletContextListener是对整个Web应用监听
image.png
Session监听
image.png
Request监听
image.png

ServletContextListener使用

image.png
监听主要使用ServletContextListener的Spring监听整个Web项目
image.png