目录
一、过滤器
1.1.过滤器概念
过滤器(filter),在Web开发中,通过Filter,可以对Web服务器管理的JSP,Servlet,静态图片等文件进行拦截,也可以在Web请求到达Servlet之前或响应返回给客户端之前对请求和响应做预处理和后处理,从而实现一些特殊的功能
1.2.过滤器工作原理
过滤器是基于函数回调实现的
过滤器(filter)对Web请求进行预处理(如:过滤敏感词汇,设置字符编码等),预处理后将请求交给Servlet进行处理并生成响应,最后filter再对服务器响应进行后处理(如:压缩响应信息等)
1.3.过滤器生命周期
实例化:Web服务器在部署Web应用时对所有过滤器进行实例化。Web服务器回调无参构造方法
初始化:Web服务器启动时,会创建Filter对象,然后调用init方法,进行初始化工作。Web服务器回调init()方法,且只调用一次,用于加载资源
过滤:Web服务器根据每一次的Web请求去校验应用配置文件设置的过滤规则,若满足过滤规则,则对请求/响应进行拦截。Web服务器回调doFilter()方法,可调用多次
销毁:Web服务器在关闭后,Filter对象被销毁,在正常关闭的情况下,在关闭前会调用destroy方法,进行销毁工作。Web服务器回调destroy()方法,且只调用一次,用于释放资源
1.4.过滤器应用场景
- 过滤敏感词汇
- 设置字符编码
- 权限访问控制
- 压缩响应信息
1.5.过滤器使用示例
// Web.xml配置
<filter>
<filter-name>Encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
// 代码示例
import javax.servlet.*;
import java.io.IOException;
public class DemoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
long startTime = System.currentTimeMillis();
chain.doFilter(request, response);
long endTime = System.currentTimeMillis();
System.out.println("Request processed in " + (endTime - startTime) + " ms");
}
@Override
public void destroy() {
// 销毁
}
}
二、拦截器
2.1.拦截器概念
拦截器(Interceptor),这里指的是Spring中的拦截器,是对过滤器更加细化的应用,是Spring框架提供的一种更加灵活的拦截器机制,他不依赖于Servlet容器,依赖于Spring框架,是AOP的一种体现,底层基于Java的动态代理实现,不仅可以在Service方法前后还可以应用到其他方法的前后进行拦截,并且一个应用中可以同时存在多个拦截器,一个请求也可以触发多个拦截器,每个拦截器会根据它被声明的顺序依次被调用
2.2.拦截器工作原理
拦截器是基于Java反射机制,属于面向切面编程(AOP)的一种应用
拦截器是在请求进入Servlet后,在进入Controller之前进行预处理,Controller渲染了对应的视图之后结束
2.3.拦截器特点
- 拦截器基于Java反射机制(动态代理)实现
- 拦截器是Spring特有的,能使用Spring的任何资源
- 拦截器可以用于Web程序、Application和Swing程序
- 拦截器可以在方法的前后,异常抛出的前后对方法进行增强,作用范围广
2.4.拦截器应用场景
- 登录校验,校验用户是否已登录
- 权限验证,校验用户是否有权限访问
- 记录日志,记录请求日志(用户IP、请求时间等)
- 性能监控,监控请求时长
2.5.拦截器使用示例
拦截器实现步骤:
- 自定义拦截器,并实现HandlerInterceptor接口
- 重写preHandle、postHandle、afterComletion方法
- 配置类注册拦截器,实现WebMvcConfigurer接口并重写addInterceptors方法
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SimpleInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在请求处理之前进行调用(Controller方法调用之前)
System.out.println("Before Controller method");
return true; // 只有返回true才会继续向下执行,返回false取消当前请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
System.out.println("After Controller method, before view rendering");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
System.out.println("After view rendering");
}
}
// 拦截器 注入
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SimpleInterceptor()).addPathPatterns("/**");
}
}
三、监听器
3.1.监听器概念
监听器是JavaEE规范中的一部分,它能够监听Web应用中的事件,如ServletContext的初始化和销毁、Session的创建和销毁等。在Spring Boot中,监听器通常用于进行一些全局性的资源初始化或清理工作
3.2.监听器分类
1.ServletContext对象监听器
主要监听ServletContext的创建,需要实现ServletContextListener接口,在整个Web服务中只有一个,并在Web服务关闭时销毁,可配合Redis做数据缓存,从而减轻数据库的压力,提高系统响应速度
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)
ServletContextAttributeListener:用于对Servlet上下文属性进行监听(增删改属性)
@WebListener
@Slf4j
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
log.info("MyServletContextListener contextInitialized has called");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("MyServletContextListener contextInitialized has called");
}
}
2.HttpSession对象监听器
主要监听Session的创建,需要实现HttpSessionListener接口,在会话起始时创建,当一端关闭会话后销毁,可用于获取在线用户数量
HttpSessionListener接口:对Session的整体状态的监听
HttpSessionAttributeListener接口:对session的属性监听
@WebListener
@Slf4j
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
log.info("MyHttpSessionListener sessionCreated has called");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
log.info("MyHttpSessionListener sessionDestroyed has called");
}
}
3.ServletRequest对象监听器
主要监听Request的创建,需要实现ServletRequestListener接口,在客户发送请求时创建,在请求处理完毕时销毁,可用于封装请求数据、用户信息等
ServletRequestListener:用于对Request请求进行监听(创建、销毁)
ServletRequestAttributeListener:对Request属性的监听(增删改属性)
@WebListener
@Slf4j
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
log.info("MyServletRequestListener requestDestroyed has called");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
log.info("MyServletRequestListener requestInitialized has called");
}
}