【SpringBoot】跨域、過濾器及swaggerUI配置

1. springboot WebAppConfig配置

/**
 * Created with IntelliJ IDEA.
 *
 * @author: zhangenke @Date: 2018/8/16 on 下午2:25
 * @description: 讓 springBoot 知道有這個攔截器
 */
@Slf4j
@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {
  //    以下WebMvcConfigurerAdapter 比較常用的重寫接口
  //    /** 解決跨域問題 **/
  //    public void addCorsMappings(CorsRegistry registry) ;
  //    /** 添加攔截器 **/
  //    void addInterceptors(InterceptorRegistry registry);
  //    /** 這裏配置視圖解析器 **/
  //    /** 視圖跳轉控制器 **/
  //    void addViewControllers(ViewControllerRegistry registry);
  //    void configureViewResolvers(ViewResolverRegistry registry);
  //    /** 配置內容裁決的一些選項 **/
  //    void configureContentNegotiation(ContentNegotiationConfigurer configurer);
  //    /** 視圖跳轉控制器 **/
  //    void addViewControllers(ViewControllerRegistry registry);
  //    /** 靜態資源處理 **/
  //    void addResourceHandlers(ResourceHandlerRegistry registry);
  //    /** 默認靜態資源處理器 **/
  //    void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);

  // private final ProcureInterceptor procureInterceptor;
  //
  // @Autowired
  // public WebAppConfig(ProcureInterceptor procureInterceptor) {
  //    this.procureInterceptor = procureInterceptor;
  // }

  private final TokenUtils tokenUtils;
  private final TokenDao tokenDaoImpl;

  @Autowired
  public WebAppConfig(TokenUtils tokenUtils, TokenDao tokenDaoImpl) {
    this.tokenUtils = tokenUtils;
    this.tokenDaoImpl = tokenDaoImpl;
  }

  @Bean
  public ProcureInterceptor getProcureInterceptor() {
    return new ProcureInterceptor(tokenUtils, tokenDaoImpl);
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    // 多個攔截器組成一個攔截器鏈
    // addPathPatterns 用於添加攔截規則
    // excludePathPatterns 用戶排除攔截
    log.info("tokenUtils:{}", tokenUtils);
    log.info("tokenDaoImpl:{}", tokenDaoImpl);
    log.info("WebAppConfig攔截器注入成功:**********************************************");
    // log.info("procureInterceptor:{}", procureInterceptor);
    // registry.addInterceptor(new ProcureInterceptor(tokenUtils,
    // tokenDaoImpl)).addPathPatterns("/**")
    registry
        .addInterceptor(getProcureInterceptor())
        .addPathPatterns("/**")
        .excludePathPatterns(
            "/swagger-resources/**",
            "/webjars/**",
            "/v2/**",
            "/swagger-ui.html/**",
            "/configuration/**");
    // 對來自/user/** 這個鏈接來的請求進行攔截;
    // super.addInterceptors(registry);
    // registry.addInterceptor(getInterfaceAuthCheckInterceptor()
    // 這種方式無論什麼情況都可以
    // registry.addInterceptor(new InterfaceAuthCheckInterceptor())
    // 這種情況時,自定義的interceptor中不能注入其他內容,比如redis或者其他service,如果要注入,必須使用上面這種方法
  }

  @Override
  protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
        .addResourceHandler("swagger-ui.html")
        .addResourceLocations("classpath:/META-INF/resources/");
    registry
        .addResourceHandler("/webjars/**")
        .addResourceLocations("classpath:/META-INF/resources/webjars/");
  }

  /**
   * @param [configurer]
   * @return void
   * @author chaosgod 2018/10/17 上午11:34
   * @description : 配置訪問靜態文件
   */
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    FastJsonConfig config = new FastJsonConfig();
    config.setSerializerFeatures(
        SerializerFeature.WriteNullListAsEmpty,
        SerializerFeature.WriteMapNullValue,
        SerializerFeature.WriteNullStringAsEmpty,
        SerializerFeature.WriteNullBooleanAsFalse,
        SerializerFeature.WriteDateUseDateFormat,
        SerializerFeature.PrettyFormat,
        SerializerFeature.DisableCircularReferenceDetect);
    converter.setFastJsonConfig(config);
    converters.add(converter);

    // SerializerFeature.WriteNullListAsEmpty:List類型字段爲null時輸出[]而非null
    // SerializerFeature.WriteMapNullValue:顯示空字段
    // SerializerFeature.WriteNullStringAsEmpty:字符串類型字段爲null時輸出""而非null
    // SerializerFeature.WriteNullBooleanAsFalse:Boolean類型字段爲null時輸出false而null
    // SerializerFeature.PrettyFormat:美化json輸出,否則會作爲整行輸出
  }

  // @Override
  // protected void addCorsMappings(CorsRegistry registry) {
  //    registry.addMapping("/**");
  //    super.addCorsMappings(registry);
  // }
}

2. ProcureInterceptor配置

/**
 * @author zhangenke
 */
@Slf4j
@Component
public class ProcureInterceptor implements HandlerInterceptor {
    private static final String VALUE = "false";
    private static final String OPTIONS = "OPTIONS";

    private final SessionService sessionServiceImpl;


    @Autowired
    public ProcureInterceptor(SessionService sessionServiceImpl) {
        this.sessionServiceImpl = sessionServiceImpl;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String[] noFilters = new String[]{"login", "errorSession", "swagger", "images", "v2"};
        String uri = request.getRequestURI();
        boolean beFilter = true;
        log.info("請求地址uri:{}", uri);
        log.info("請求方式:{}", request.getMethod());
        // 預請求
        if (OPTIONS.equals(request.getMethod())) {
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "*");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "Authentication,Origin, X-Requested-With, " +
                    "Content-Type, Accept,sessionId");
            return true;
        }
        // 配置跨域
        response.setHeader("Access-Control-Allow-Origin", "*");

        String requestId = request.getHeader("X-REQUEST-ID");
        String userAgent = request.getHeader("User-Agent");
        if (requestId != null) {
            MDC.put("requestUUID", requestId);
        }
        if (userAgent != null) {
            MDC.put("User-Agent", userAgent);
        }
        log.info("變量:{}", JSON.toJSONString(request.getParameterMap()));
        String sessionId = request.getHeader("sessionId");
        log.info("Headers-sessionId: {}", sessionId);
        for (String s : noFilters) {
            if (uri.contains(s)) {
                beFilter = false;
                break;
            }
        }
        String origin = request.getHeader("Origin");
        log.info("請求收到的Origin爲:{}", origin);
        
        // todo
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception
            ex) {
        // TODO Auto-generated method stub

    }

 
}

如上圖,這樣配置即可,

2018-10-23優化,親測可過swagger-ui,及靜態文件

2019-01-22優化,本地測試可隨意過,上線Linux,會偶爾出現跨域,但重新打包後,又可以過。

目前,暫未找到該問題的解決辦法

(可能與Linux有關,殺掉進程後,如果Enter直到出現此進程被殺的提示後,重新上線,即可過)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章