1 三大组件之Filter过滤器
1.1 概念与运行原理
基础概念
Filter译为过滤器。 由于 Servlet 规范是开放的,借助于公众与开源社区的力量, Servlet 规范越来越科学,功能也越来越强大。 2000 年, Sun 公司在 Servlet2.3 规范中添加了 Filter 功能,并在 Servlet2.4 中对 Filter 进行了细节上的补充。
运行原理
当客户端向服务器端发送一个请求时,如果有对应的过滤器进行拦截,过滤器可以改变请求的内容、或者重新设置请求协议的相关信息等,然后再将请求发送给服务器端的Servlet进行处理。当Servlet对客户端做出响应时,过滤器同样可以进行拦截,将响应内容进行修改或者重新设置后,再响应给客户端浏览器。在上述过程中,客户端与服务器端并不需要知道过滤器的存在。
在一个Web应用程序中,可以部署多个过滤器进行拦截,这些过滤器组成了一个过滤器链。过滤器链中的每个过滤器负责特定的操作和任务,客户端的请求在这些过滤器之间传递,直到服务器端的Servlet。具体执行流程如下:
1.2 SpringBoot使用自定义的Filter过滤器
实现了Filter接口MyBrandFilter
package com.efly.gulimall.product.filter;import javax.servlet.*;import java.io.IOException;public class MyBrandFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) {System.out.println("init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("doFilter");//拦截了需要把请求释放了filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}}
将上面自定义的MyBrandFilter注入到SpringIOC
package com.efly.gulimall.product.config;import com.efly.gulimall.product.filter.MyBrandFilter;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.Arrays;@Configurationpublic class RegistServletFilterListenerConfig {@Beanpublic FilterRegistrationBean myFilter() {//自定义过滤器MyBrandFilter myBrandFilter = new MyBrandFilter();FilterRegistrationBean filterRegistrationBean =new FilterRegistrationBean(myBrandFilter);//要监听的Servlet路径filterRegistrationBean.setUrlPatterns(Arrays.asList("/product/brand/*"));return filterRegistrationBean;}}
测试
package com.efly.gulimall.product.controller;import com.efly.common.utils.PageUtils;import com.efly.common.utils.R;import com.efly.gulimall.product.service.BrandService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.util.Map;import java.util.concurrent.ThreadPoolExecutor;/*** 品牌** @author zhuyf* @email 946150650@qq.com* @date 2021-07-15 11:23:13*/@Controller@RequestMapping("product/brand")public class BrandController {@Autowiredprivate BrandService brandService;@Autowiredprivate ThreadPoolExecutor executor;@RequestMapping("/list")public R list(Map<String, Object> params) throws Exception {PageUtils pageDB = brandService.queryPageFromDB(params);return R.ok().put("page", pageDB);}@RequestMapping("/setSession")public String setSession(HttpSession session, HttpServletRequest request) {System.out.println("set");StudentVO studentVO = new StudentVO();studentVO.setAge(11);//存入方式一request.getSession().setAttribute("studentVo", studentVO);//存入方式二session.setAttribute("name", "fly");return "match";}@RequestMapping("/getSession")public String getSession(HttpSession session, HttpServletRequest request) {System.out.println(session.getAttribute("fly"));System.out.println(request.getSession().getAttribute("studentVo"));return "match";}}测试结果:项目启动的时候,会先出发Filter.init()方法,输出init访问product/brand/*下的任意一个接口,都会先调用Filter的doFilter()方法
1.3 Filter过滤器和Interceptor拦截器
1.3.1 概述
2 三大组件之Listener监听器
监听器就是实时监视一些事物状态的程序,我们称为监听器。目前众多的监听器中只有ServletContextListener还有一定的用处。
实现步骤
- 创建一个ServletContextListenerImpl类实现ServletContextListener

- 在web.xml文件中的配置如下
- 这个时候,启动web工程和正常停止web工程,后台都会如下打印



