欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot 自定义拦截器

程序员文章站 2022-04-30 16:34:47
...

拦截器


spring拦截器类似于servlet的filter过滤器,用来拦截controller的请求过程。

定义拦截器


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;


@Component
public class MyInterceptor implements HandlerInterceptor {


    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器开始拦截");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("拦截器时");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("拦截器之后");
    }
}

HandlerInterceptor 中有三个重载方法,分别对应着cottorller响应的三个生命周期:

preHandle


preHandle作用的地方是请求已经被RequestMapping分配到了不同的Controller里,但是还并未被Controller进行处理。
如果我们的目的是对登陆进行验证的话,那么这里就是我们主要的工作地点了。在这个过程里,我们可以验证用户的Cookie:

  • 如果成功,则可以记录下当前User的信息,并且将这个信息保存到一个ThreadLocal的UserComponent里,方便以后的调用,并且将请求放行。
  • 如果失败,则可以将请求通过response的sendRedirect函数重定向到登陆页面。
    这里的返回值就是是否放行,如果不放行,那么客户端就收不到任何消息。显然我们一般都会放行。

postHandle


postHandle处理的是已经被Conttroller处理了,但是还未传递到网页模板进行渲染的时候。因此我们可以看到postHandle的参数比preHandle多了一个ModelAndView这个参数。这个参数其实就包括了Controller处理后需要传递给模板的那个Model参数。

default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            @Nullable ModelAndView modelAndView) throws Exception {
    }

afterCompletion


afterCompletion显然就是处理一些收尾工作了,他作用的地方就是在页面被渲染之后即将返回给用户的时候。这里通常是清除一些局部变量,比如清除掉在前面保存的ThreadLocal的本地信息。

配置拦截器


如果使用的boot版本是2.0以前的需要继承WebMvcConfigurationSupport类,如果是2.0以后的则需要继承WebMvcConfigurerAdapter这个类,因为在2.0以后WebMvcConfigurerAdapter已经被弃用了。用WebMvcConfigurationSupport替代。

import com.gimhon.springsample.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

@SpringBootConfiguration
public class InterceptorConfig extends WebMvcConfigurationSupport {

    @Autowired
    MyInterceptor myInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");
        System.out.println("拦截器启动");
        super.addInterceptors(registry);
    }
}

注意:

  • 这个拦截器只能拦截controller请求,普通的servlet无效。

spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法

参考:https://my.oschina.net/dengfuwei/blog/1795346
参考:https://blog.mythsman.com/2017/05/21/2/