Springboot攔截器注入失敗導致跨域

1. ProcureInterceptor


import static com.construn.procure.common.Variable.SECRETPC;
import static com.construn.procure.common.Variable.SECRETWAP;
import static com.construn.procure.common.Variable.TOKEN;
import static org.springframework.web.bind.annotation.RequestMethod.OPTIONS;

import com.alibaba.fastjson.JSON;
import com.construn.procure.constant.Num;
import com.construn.procure.dao.TokenDao;
import com.construn.procure.entity.Token;
import com.construn.procure.util.TokenUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.MyBatisSystemException;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author chaosgod 2019-02-27 11:24
 * @return
 * @description :
 */
@Slf4j
@Component
public class ProcureInterceptor implements HandlerInterceptor {

  @Autowired
  private TokenUtils tokenUtils;
  @Autowired
  private TokenDao tokenDaoImpl;

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    log.info("攔截器ProcureInterceptor:*******************************");
    String[] noFilters =
        new String[]{
            "login",
            "sendMsg",
            "errorQuest"
        };
    String uri = request.getRequestURI();
    boolean beFilter = true;
    log.info("請求地址uri:{}", uri);
    log.info("請求方式:{}", request.getMethod());
    // 預請求
    if (OPTIONS.toString().equals(request.getMethod())) {
      response.setHeader("Access-Control-Allow-Origin", "*");
      // 單獨寫get/put/delete/post
      // 直接寫 * 在其他瀏覽器不支持訪問。*不代表全部
      response.setHeader("Access-Control-Allow-Methods", "GET,PUT,DELETE,POST,OPTIONS");
      response.setHeader("Access-Control-Max-Age", "3600");
      response.setHeader(
          "Access-Control-Allow-Headers",
          "Authentication,Origin, X-Requested-With, " + "Content-Type, Accept,token");
      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);
    }
    String userId = "non-user";
    MDC.put("userId", userId);
    log.info("變量:{}", JSON.toJSONString(request.getParameterMap()));
    for (String s : noFilters) {
      String[] ss = uri.split("/");
      if (s.equals(ss[ss.length - 1]) || s.equals(ss[ss.length - 2])) {
        beFilter = false;
        log.error("包含不走攔截器:{}", s);
        break;
      }
    }
    String origin = request.getHeader("Origin");
    log.info("請求收到的Origin爲:{}", origin);
    if (beFilter) {

      log.info("toke驗證通過√ √ √ √ √ √ √ √ √ √ √ √ √ √");
      MDC.put("userId", userId);
      Variable.userSession.set(token);
  
      return true;
    }
    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

  }


}

2. WebAppConfig

package com.construn.procure.common;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import java.util.ArrayList;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Created with IntelliJ IDEA.
 *
 * @author: zhangenke @Date: 2018/8/16 on 下午2:25
 * @description: 讓 springBoot 知道有這個攔截器 extends WebMvcConfigurationSupport 偶爾加載成功 implements
 *     WebMvcConfigurer 直接不會運行
 */
@Slf4j
@Configuration
public class WebAppConfig implements WebMvcConfigurer {

  @Bean
  ProcureInterceptor getProcureInterceptor() {
    return new ProcureInterceptor();
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    log.info("WebAppConfig攔截器注入成功");
    registry.addInterceptor(getProcureInterceptor()).addPathPatterns("/**");
    // 對來自/user/** 這個鏈接來的請求進行攔截;
    // registry.addInterceptor(getInterfaceAuthCheckInterceptor()
    // 這種方式無論什麼情況都可以
    // registry.addInterceptor(new InterfaceAuthCheckInterceptor())
    // 這種情況時,自定義的interceptor中不能注入其他內容,比如redis或者其他service,如果要注入,必須使用上面這種方法
  }

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry
        .addMapping("/**")
        .allowedOrigins("*")
        .allowCredentials(true)
        .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS")
        .maxAge(3600);
  }

  private CorsConfiguration addCorsConfig() {
    CorsConfiguration corsConfiguration = new CorsConfiguration();
    List<String> list = new ArrayList<>();
    list.add("*");
    corsConfiguration.setAllowedOrigins(list);
    corsConfiguration.addAllowedOrigin("*");
    corsConfiguration.addAllowedHeader("*");
    corsConfiguration.addAllowedMethod("*");
    return corsConfiguration;
  }

  @Bean
  public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", addCorsConfig());
    return new CorsFilter(source);
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    log.info("靜態文件注入成功");
    registry
        .addResourceHandler("swagger-ui.html")
        .addResourceLocations("classpath:/META-INF/resources/");
    registry
        .addResourceHandler("/webjars/**")
        .addResourceLocations("classpath:/META-INF/resources/webjars/");
    registry
        .addResourceHandler("/swagger-resources/**")
        .addResourceLocations("classpath:/META-INF/resources/swagger-resources/");
    registry
        .addResourceHandler("/swagger/**")
        .addResourceLocations("classpath:/META-INF/resources/swagger*");
    registry
        .addResourceHandler("/v2/api-docs/**")
        .addResourceLocations("classpath:/META-INF/resources/v2/api-docs/");
  }

  /**
   * @return void
   * @author chaosgod 2018/10/17 上午11:34
   * @description : 配置訪問靜態文件
   */
  @Override
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    log.info("訪問靜態文件注入成功");
    configurer.enable();
    //    super.configureDefaultServletHandling(configurer);
  }

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    log.info("Json格式注入成功");
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    FastJsonConfig config = new FastJsonConfig();
    config.setSerializerFeatures(
        SerializerFeature.WriteNullListAsEmpty,
        SerializerFeature.WriteMapNullValue,
        SerializerFeature.WriteNullStringAsEmpty,
        SerializerFeature.WriteNullBooleanAsFalse,
        SerializerFeature.WriteDateUseDateFormat,
        SerializerFeature.PrettyFormat,
        SerializerFeature.DisableCircularReferenceDetect);
    // 3處理中文亂碼問題
    List<MediaType> fastMediaTypes = new ArrayList<>();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    // 4.在convert中添加配置信息.
    converter.setSupportedMediaTypes(fastMediaTypes);
    converter.setFastJsonConfig(config);
    // 5.將convert添加到converters當中.
    converters.add(converter);

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


}

3. 包

4. 啓動提示

5. 查看其他配置類是否和 implements WebMvcConfigurer是否有衝突,

6. 最終查看到swaggerUI配置類使用的是 extends WebMvcConfigurationSupport這種方式,導致衝突,

改爲public class SwaggerConfig implements WebMvcConfigurer {這種方式啓動正常。。

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