Filter的配置
方式1
- 实现一个filter类,通过实现filter接口,关于filter接口以及相关功能在此不作介绍.
- 在上面使用
@WebFilter注解
- 使用
@ServletComponentScan
在启动类上扫描filter
filter类
//filter
@WebFilter(urlPatterns = "/api/*")
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行了 MyFilter");
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {
}
}
启动类
要保证能够扫描到filter类
@SpringBootApplication
@ServletComponentScan
public class WebApplication {
public static void main(String[] args){
SpringApplication.run(WebApplication.class);
}
}
运行日志
方式二
- 依然是自定义一个Filter类,不需要
@WebFilter
注解,只需要使用@Component
注解
@Component
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行了 MyFilter");
filterChain.doFilter(servletRequest,servletResponse);
}
public void destroy() {
}
}
- 在启动类中注入Bean
@SpringBootApplication
public class WebApplication {
public static void main(String[] args){
SpringApplication.run(WebApplication.class);
}
@Bean
public FilterRegistrationBean registrationBean(MyFilter myFilter){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
//将我们自己定义的过滤器设置进去
registrationBean.setFilter(myFilter);
//为当前的Filter添加拦截路径
registrationBean.addUrlPatterns("/api/*");
//为Filter配置一个名称
registrationBean.setName("MyFilter");
//为Filter设置在过滤器链中的执行顺序
registrationBean.setOrder(1);
return registrationBean;
}
}
- 运行查看效果
Interceptor配置
拦截器是SpringMvc中的,配置起来类似Filter
- 通过实现HandlerInterceptor接口来实现自定义的拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {
//前置处理,在执行controller之前处理
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor preHandle 执行了");
//如果return false那么就不会去执行controller
return true;
}
//在执行了controller之后执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor postHandle 执行了");
}
//最后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor afterCompletion 执行了");
}
}
- 需要添加一个配置类,通过继承WebMvcConfigureAdaptor
但是这里有个问题,就是在springboot2中这个WebMvcConfigurerAdapter
是被标志为过时了,不推荐使用了,但是用的话还是没问题,依旧可以正常使用。
//
@Component
public class MyWebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器并添加拦截器的拦截路径
registry.addInterceptor(myInterceptor).addPathPatterns("/api/*");
}
}
我们可以把继承这个WebMvcConfigurerAdapter
换成实现WebMvcConfigure
,因为在jdk8中接口提供了默认方法,所以不需要使用类来重写接口中的方法,所以也就不需要WebMvcConfigurerAdapter
这个类了
@Component
public class MyWebMvcConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器并添加拦截器的拦截路径
registry.addInterceptor(myInterceptor).addPathPatterns("/api/*");
}
}
直接运行启动类,默认的控制台输出上不会显示是否添加了拦截器的信息,我们写一个controller来测试一下
@RestController
@RequestMapping("/api/web/user")
public class UserController {
@GetMapping
public String getUser(String id){
System.out.println("执行了getUser:"+id);
return "执行成功";
}
}
可以发现好像并没有执行interceptor,好像只执行了filter,这是为什么呢?
因为在上面我们为拦截器配置拦截路径的时候配置的是/api/*
这个配置的是有问题的,因该配置为/api/**
,我们修改配置后再来试一下。
成功了~~~~我们在这里也可以发现filter和interceptor的执行顺序