Spring Boot 2在安全拦截器之前添加拦截器

时间:2019-09-20 07:28:02

标签: spring spring-security spring-oauth2

如何在Spring安全检查拦截器之前添加自定义拦截器(安全性oauth中止请求时需要日志请求数据)。

1 个答案:

答案 0 :(得分:0)

Spring Handler拦截器

在框架上使用HandlerMapping的拦截器必须实现HandlerInterceptor接口。

此界面包含三种主要方法:

prehandle() –在执行实际处理程序之前调用,但是尚未生成视图 postHandle() –执行处理程序后调用

afterCompletion() –在完整请求完成并生成视图之后调用 这三种方法为执行各种预处理和后期处理提供了灵活性。

还有一个简短的说明– HandlerInterceptorHandlerInterceptorAdapter之间的主要区别在于,在第一个方法中,我们需要覆盖所有三个方法:preHandle(), postHandle() and afterCompletion(),而在第二个方法中,我们可以实现只是必需的方法。

    public class LoggerInterceptor extends HandlerInterceptorAdapter {
       @Override
       public boolean preHandle(
       HttpServletRequest request,
       HttpServletResponse response,Object handler) throws Exception {

       log.info("[preHandle][" + request + "]" + "[" + request.getMethod()
         + "]" + request.getRequestURI() + getParameters(request));

        return true;
       }
    }

由于您使用的是Spring Boot,因此我假设您希望尽可能地依赖Spring的自动配置。要添加其他自定义配置(例如拦截器),只需提供WebMvcConfigurerAdapter的配置或bean。

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

  @Autowired 
  HandlerInterceptor yourInjectedInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(...)
    ...
    registry.addInterceptor(getYourInterceptor()); 
    registry.addInterceptor(yourInjectedInterceptor);
    // next two should be avoid -- tightly coupled and not very testable
    registry.addInterceptor(new YourInterceptor());
    registry.addInterceptor(new HandlerInterceptor() {
        ...
    });
  }
}