前置内容:
1、 过滤器Filter
1.1 Filter快速入门
- 使用步骤
- 定义类并实现Filter接口
- 定义@WebFilter注解,配置拦截路径
- 放行
- (请求其他资源)
- Demo
package priv.dandelion.controller.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("FilterDemo...");
// 放行
filterChain.doFilter(servletRequest, servletResponse);
// 放行后逻辑
}
@Override
public void destroy() {
}
}
1.2 Filter执行流程
- 浏览器发送请求到服务器
- Filter拦截请求
- 执行放行前逻辑
- 放行请求
- 访问对应资源
- 执行放行后逻辑
- 服务器对浏览器做出响应
1.3 Filter使用细节
- 拦截路径配置
- 拦截具体资源:
/index.jsp
- 目录拦截:
/user/*
- 后缀名拦截:
*.jsp
- 拦截所有:
/*
- 过滤器链
- 一个Web应用可以配置多个过滤器,多个过滤器成为过滤器链
- 多个过滤器逐一放行
- 请求资源
- 按照递归顺序执行过滤器链的放行后逻辑
- 过滤器链的过滤顺序
- 若使用注解配置过滤器,则按照全类名进行排序,即为过滤器链的执行顺序
- 可在XML中配置顺序
1.4 案例
- 需求
- 访问服务器资源时,需要先进行登录验证,如果没有登录则自动跳转到登录页面
- 方式
- 判断请求资源是否和登录注册相关,若是则放行
- 判断Session中是否有User对象,若有则放行,否则跳转到登录
- 环境准备
环境和案例框架见:用户登录注册案例
- 代码实现
package priv.dandelion.controller.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
// 判断访问的资源是否和登录注册相关
String[] urls = {"/login.jsp", "/register.jsp", "/imgs/", "/css/", "/login", "/register", "/checkCode"};
// 获取当前访问资源的路径
String requestURL = req.getRequestURL().toString();
for (String url : urls) {
if (requestURL.contains(url)) {
// 若为和登录注册相关的资源,则放行并直接结束过滤器执行
System.out.println(url);
filterChain.doFilter(req, servletResponse);
return;
}
}
// 判断Session中是否有user
// 获取Session
Object user = req.getSession().getAttribute("user");
if (user != null) {
// 放行
System.out.println("已登录,放行"+ user);
filterChain.doFilter(servletRequest, servletResponse);
} else {
// 存储提示信息,拦截跳转到登录页面
System.out.println("未登录,将跳转到登录页面");
req.setAttribute("login_msg", "您尚未登录!");
req.getRequestDispatcher("/login.jsp").forward(req, servletResponse);
}
}
@Override
public void destroy() {
}
}
2、 监听器Listener概述
2.1 概述
- Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
- 监听器可以监听就是在
application
,session
,request
三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
application
是ServletContext
类型的对象。ServletContext
代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。
2.2 分类
监听器分类 监听器名称 作用 ServletContext监听 ServletContextListener 用于对ServletContext对象进行监听(创建、销毁) :: ServletContextAttributeLintener 用于对ServletContext对象中的属性的监听(增删改属性) Session监听 HttpSessionListener 对Session对象的整体状态监听(创建、销毁) :: HttpSessionAttributeLintener 对Session对象中的属性的监听(增删改属性) :: HttpSessionBindingListener 监听对象与Session的绑定和解除 :: HttpSessionActivationListener 对Session数据的钝化和活化的监听 Request监听 ServletRequestListener 对Request对象的监听(创建、销毁) :: ServletRequestAttributeListener 对Request对象中属性的监听(增删改属性)
2.3 代码演示
package priv.dandelion.controller.Listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 加载资源
System.out.println("ContextLoaderListener initialized...");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// 释放资源
System.out.println("ContextLoaderListener destroyed...");
}
}
Original: https://www.cnblogs.com/dandelion-000-blog/p/16813114.html
Author: Dandelion_000
Title: Filter拦截器从入门到快速上手与Listener监听器概述
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713558/
转载文章受原作者版权保护。转载请注明原作者出处!