接上一篇 java 笔记 - javaWeb 核心 2 - Request 和 Response
一、Filter
当几个或者全部的 servlet 需要执行某个公共逻辑的时候,可以使用Filter。当访问 servlet 资源的时候程序会先执行匹配到的filter,然后再去执行这个 servlet 的逻辑,同样也可以在filter放行资源后执行某些通用逻辑。
image.png
(1)Filter 快速入门
image.png
package com.test.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
// 过滤器
@WebFilter("/*")
public class filterDemo implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("请求所有资源前被 filter 拦截了...");
// 放行资源
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("请求所有资源后被 filter 拦截了...");
}
@Override
public void destroy() {
}
}
(2)Filter 执行流程
image.png
(3)Filter 使用细节
- 1.Filter 拦截路径配置
image.png
- 2.过滤器链
image.png
filter 应用场景demo:
image.png
image.png
未登录就能访问的资源直接放行
image.png
二、Listener
监听器就是监听某些操作,当这个操作被触发了就会执行对应的监听器,类似 js 的 eventListener。
image.png
目前监听器用得不多,基本只会用ServletContextListener,这个代表web应用被加载成功:
package com.test.web.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ListenerDemo implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 加载资源
System.out.println("java web应用启动了...");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// 释放资源
System.out.println("java web应用销毁了...");
}
}
image.png