1.自定义一个类实现Filter接口
package com.example.demo.filter;
import jakarta.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setAttribute("username","cao");
servletRequest.setAttribute("age",22);
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("filter");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
2.注册我们自定义的Filter
package com.example.demo.config;
import com.example.demo.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
3.控制层
package com.example.demo.controller;
import com.example.demo.config.HttpResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class FilterController {
@GetMapping("/filter")
public HttpResponse getFilter(HttpServletRequest request, HttpServletResponse response){
String username = (String) request.getAttribute("username");
System.out.println(username);
Integer age = (Integer) request.getAttribute("age");
System.out.println(age);
return HttpResponse.ok();
}
}
4.多个过滤器
多个过滤器执行的顺序和在配置文件中配置的顺序是一样的
再自定义一个Filter同时在配置文件中写一下
package com.example.demo.filter;
import jakarta.servlet.*;
import java.io.IOException;
public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setAttribute("message","Filter1");
servletRequest.setAttribute("code",200);
System.out.println("filter1");
//filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
@Bean
public FilterRegistrationBean registrationBean2() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter1());
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
我们可以通过setOrder()来控制过滤器执行的顺序
以前我一直理解错了,我认为一个请求过来会将所有的过滤器执行才会去Controller,原来是请求先是被Filter拦截,进行处理后在Controller执行,执行完成后,再执行 filterChain.doFilter(servletRequest,servletResponse)后的内容
那这样的话我就能记录一个请求的执行时间了
long start = System.currentTimeMillis();
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("Execute cost="(System.currentTimeMillis()-start));
5.拦截器
目前的代码是这样的——使用一个过滤器
package com.example.demo.filter;
import jakarta.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setAttribute("username","cao");
servletRequest.setAttribute("age",22);
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("filter");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
package com.example.demo.config;
import com.example.demo.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registrationBean1() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setName("MyFilter");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
}
自定义一个拦截器实现HandlerInterceptor接口
package com.example.demo.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String username = (String) request.getAttribute("username");
Integer age = (Integer) request.getAttribute("age");
System.out.println(username+"interceptor");
System.out.println(age+"interceptor");
return true;
}
//至于postHandle和afterCompletion这两个方法这里暂时不用
}
写一个配置类配置我们写的拦截器
package com.example.demo.config;
import com.example.demo.interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
看一下我们的输出结果
6.多个拦截器
继续自定义一个拦截器
package com.example.demo.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("email","2343@qq.com");
request.setAttribute("address","北京市昌平区");
System.out.println("MyInterceptor1");
return true;
}
}
注册
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
多个拦截器执行的顺序就是按照注册的顺序执行
7.多个过滤器和多个拦截器
过滤器
package com.example.demo.filter;
import jakarta.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setAttribute("username","cao");
servletRequest.setAttribute("age",22);
System.out.println("11111111");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
package com.example.demo.filter;
import jakarta.servlet.*;
import java.io.IOException;
public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setAttribute("message","Filter1");
servletRequest.setAttribute("code",200);
System.out.println("filter1");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
package com.example.demo.config;
import com.example.demo.filter.MyFilter;
import com.example.demo.filter.MyFilter1;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean registrationBean1() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setName("MyFilter");
filterRegistrationBean.setOrder(1);
return filterRegistrationBean;
}
@Bean
public FilterRegistrationBean registrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter1());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setName("MyFilter1");
filterRegistrationBean.setOrder(4);
return filterRegistrationBean;
}
}
拦截器
package com.example.demo.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String username = (String) request.getAttribute("username");
Integer age = (Integer) request.getAttribute("age");
System.out.println(username+"interceptor");
System.out.println(age+"interceptor");
return true;
}
//至于postHandle和afterCompletion这两个方法这里暂时不用
}
package com.example.demo.interceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
public class MyInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("email","2343@qq.com");
request.setAttribute("address","北京市昌平区");
System.out.println("MyInterceptor1");
return true;
}
}
package com.example.demo.config;
import com.example.demo.interceptor.MyInterceptor;
import com.example.demo.interceptor.MyInterceptor1;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
控制器
@RestController
public class FilterController {
@GetMapping("/filter")
public HttpResponse getFilter(HttpServletRequest request, HttpServletResponse response){
String username = (String) request.getAttribute("username");
String email = (String) request.getAttribute("email");
String address = (String) request.getAttribute("address");
System.out.println(username);
Integer age = (Integer) request.getAttribute("age");
System.out.println(age);
System.out.println(email);
System.out.println(address);
String message = (String) request.getAttribute("message");
System.out.println(message);
return HttpResponse.ok();
}
}
执行结果
结论:请求进入Tomcat容器以后,过滤器-------->拦截器--------〉控制器------>最后执行doChainFilter