如何在Spring Boot中仅使用一个拦截器处理所有传入请求

时间:2019-07-19 04:00:14

标签: spring-boot interceptor

我已经从几天开始进行了春季启动,现在我想为所有传入请求提供安全拦截器。在研究教程时,我发现有一个带有@Component注释的类,它实现了HandlerInterceptor

@Component
public class ProductServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

      return true;
   }
   @Override
   public void postHandle(
      HttpServletRequest request, HttpServletResponse response, Object handler, 
      ModelAndView modelAndView) throws Exception {}

   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, 
      Object handler, Exception exception) throws Exception {}
}

,然后必须像

一样使用InterceptorRegistryWebMvcConfigurerAdapter注册此拦截器
@Component
public class ProductServiceInterceptorAppConfig extends WebMvcConfigurerAdapter {
   @Autowired
   ProductServiceInterceptor productServiceInterceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(productServiceInterceptor);
   }
}

但是在本教程中,我很困惑,拦截器仅用于一种服务,即Products,我的问题是如何拥有single interceptor class which will intercept all the incoming requests irrespective of any controller path

1 个答案:

答案 0 :(得分:0)

如果要保护应用程序安全,则可能需要研究Spring Security项目。

要实现您要执行的操作,您将需要使用FilterFilterRegistrationBean

过滤器将拦截您在注册Bean中定义的路径中的每个请求和响应。

Filter Javadoc:

  

由于客户端请求链末端的资源,因此每次通过链传递请求/响应对时,容器都会调用Filter的doFilter方法。传入此方法的FilterChain允许Filter将请求和响应传递给链中的下一个实体。   此方法的典型实现将遵循以下模式:

     
      
  1. 检查请求
  2.   
  3. (可选)使用自定义实现包装请求对象,以过滤内容或标头以进行输入过滤
  4.   
  5. (可选)使用自定义实现包装响应对象,以过滤内容或标题以进行输出过滤
  6.   
  7. a)使用FilterChain对象(chain.doFilter())调用链中的下一个实体,
  8.   
  9. b)或不将请求/响应对传递给过滤器链中的下一个实体,以阻止请求处理
  10.   
  11. 在调用过滤器链中的下一个实体后,直接在响应上设置标头。
  12.   

下面的示例过滤了来自根(“ / *”)路径的所有请求。

package com.example.demo;

import javax.servlet.Filter;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

  private static final Logger log = LoggerFactory.getLogger(FilterConfig.class);

  @Bean
  public FilterRegistrationBean<Filter> registrationBean(Filter sampleFilter) {
    FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();

    bean.setFilter(sampleFilter);
    bean.addUrlPatterns("/*");

    return bean;
  }

  @Bean
  public Filter sampleFilter() {
    return (request, response, filterChain) -> {
      HttpServletRequest servletRequest = (HttpServletRequest) request;
      log.info(
          "Request URI : {}",
          servletRequest.getRequestURI());

      filterChain.doFilter(request, response);
      log.info(
          "After filtering the request : {}",
          servletRequest.getRequestURI());

    };
  }

}