目录
1 拦截器与过滤器是什么(What???)
1.1什么是过滤器(Filter)
属于Servlet的东西:javax.servlet.Filter;
Defination: A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both.
大致意思就是:过滤器是一个用于执行过滤任务的对象,要么执行对资源的请求,要么执行来自资源响应,或者二者都执行
1.2什么是拦截器(Interceptor)
属于Spring的东西:org.springframework.web.servlet.HandlerInterceptor;
2 为什么要用拦截器和过滤器(Why???)
3 拦截器和过滤器的关系(Relation???)
一张图解释请求是怎么通过过滤器和拦截器的:、
(1)请求先进过滤器,再进拦截器;
(2)请先从拦截器出,再从过滤器出
进:Filter1->Filter2->FilterN ->Interceptor1->Interceptor2->InterceptorN
出:InterceptorN->Interceptor2->Interceptor1->FilterN->Filter2->Filter1
4 如何使用拦截器和过滤器(How???)
本节介绍Filter && Interceptor在Springboot中的最佳实践
4.1 创建过滤器
创建第一个Filter(MyFilter)
package com.springboot.learning.demo.filter;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
/**
* @author gavin
* @date 2021-07-01 7:31 下午
*/
@Component
@Order(value = 1)
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("pre doFilter");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("post doFilter");
}
@Override
public void destroy() {
System.out.println("filter destroy");
}
}
创建第二个filter(MyFilter2)
package com.springboot.learning.demo.filter;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
/**
* @author gavin
* @date 2021-07-01 7:57 下午
*/
@Component
@Order(value = 2)
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter init2");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("pre doFilter2");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("post doFilter2");
}
@Override
public void destroy() {
System.out.println("filter destroy2");
}
}
@Order(value = 2)表示Filter的执行顺序,数值越小,执行优先级越高
4.2 创建拦截器
创建第一个拦截器(MyInterceptor)
package com.springboot.learning.demo.interceptor;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author gavin
* @date 2021-07-01 8:02 下午
*/
@SuppressWarnings("all")
@Component
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("myInterceptor1 preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("myInterceptor1 postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("myInterceptor1 afterCompletion");
}
}
创建第二个拦截器(MyInterceptor)
package com.springboot.learning.demo.interceptor;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author gavin
* @date 2021-07-01 8:19 下午
*/
@Component
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("myInterceptor2 preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("myInterceptor2 postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("myInterceptor2 afterCompletion");
}
}
拦截器注册,拦截器执行顺序与注册顺序(加入registry的顺序)一致
package com.springboot.learning.demo.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
/**
* @author gavin
* @date 2021-07-01 8:14 下午
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
MyInterceptor myInterceptor;
@Resource
MyInterceptor2 myInterceptor2;
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(myInterceptor);
registry.addInterceptor(myInterceptor2);
}
}
4.3 SpringBoot启动类
package com.springboot.learning.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
4.4 Controller层服务
package com.springboot.learning.demo;
import com.springboot.learning.demo.cache.Student;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletRequest;
@RestController
public class HelloWorldService {
@RequestMapping(value = "/hello")
public ResponseModel<String> hello(Integer topN) {
System.out.println("hello world");
if (topN < 10){
throw new RuntimeException("tttt");
}else {
return new ResponseModel<String>("helloworld", "200",
"success", "qweqweqe");
}
}
}
4.5 运行效果
发起请求:http://127.0.0.1:8080/hello?topN=100
5 Reference
[1]https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html