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 {
@Override
public void init(FilterConfig filterConfig) {
System.out.println("init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
//拦截了需要把请求释放了
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public 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;
@Configuration
public class RegistServletFilterListenerConfig {
@Bean
public 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 {
@Autowired
private BrandService brandService;
@Autowired
private 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工程,后台都会如下打印