[SpringBoot] cross domain, filter and swaggerUI configuration

Posted by mrgrammar on Tue, 15 Oct 2019 21:45:23 +0200

1. springboot WebAppConfig configuration

/**
 * Created with IntelliJ IDEA.
 *
 * @author: zhangenke @Date: 2018/8/16 on 2:25 p.m.
 * @description: Let springBoot know that there is this interceptor
 */
@Slf4j
@Configuration
public class WebAppConfig extends WebMvcConfigurationSupport {
  // The following rewriting interfaces are commonly used by WebMvcConfigurerAdapter
  // Solve cross domain problems**/
  //    public void addCorsMappings(CorsRegistry registry) ;
  // Add interceptor**/
  //    void addInterceptors(InterceptorRegistry registry);
  // Configuration of view resolver here**/
  // View jump controller**/
  //    void addViewControllers(ViewControllerRegistry registry);
  //    void configureViewResolvers(ViewResolverRegistry registry);
  // Some options for configuring content adjudication**/
  //    void configureContentNegotiation(ContentNegotiationConfigurer configurer);
  // View jump controller**/
  //    void addViewControllers(ViewControllerRegistry registry);
  // Static resource processing**/
  //    void addResourceHandlers(ResourceHandlerRegistry registry);
  // Default static resource processor**/
  //    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) {
    // Multiple interceptors form an interceptor chain
    // addPathPatterns to add interception rules
    // excludePathPatterns user exclusion
    log.info("tokenUtils:{}", tokenUtils);
    log.info("tokenDaoImpl:{}", tokenDaoImpl);
    log.info("WebAppConfig Interceptor injection succeeded:**********************************************");
    // log.info("procureInterceptor:{}", procureInterceptor);
    // registry.addInterceptor(new ProcureInterceptor(tokenUtils,
    // tokenDaoImpl)).addPathPatterns("/**")
    registry
        .addInterceptor(getProcureInterceptor())
        .addPathPatterns("/**")
        .excludePathPatterns(
            "/swagger-resources/**",
            "/webjars/**",
            "/v2/**",
            "/swagger-ui.html/**",
            "/configuration/**");
    // Intercept requests from the link / user / *;
    // super.addInterceptors(registry);
    // registry.addInterceptor(getInterfaceAuthCheckInterceptor()
    // This way, no matter what.
    // registry.addInterceptor(new InterfaceAuthCheckInterceptor())
    // In this case, the custom interceptor cannot inject other content, such as redis or other service s. If you want to inject, you must use the above method.
  }
 
  @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 a.m.
   * @description : Configure access to static files
   */
  @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: output [] instead of null when the List type field is null
    // SerializerFeature.WriteMapNullValue: show empty fields
    // SerializerFeature.WriteNullStringAsEmpty: output '' instead of null when string type field is null
    // Serializerfeature.writenullboolean asfalse: output false and null when Boolean type field is null
    // SerializerFeature.PrettyFormat: Beautify json output, otherwise it will be output as the whole line
  }
 
  // @Override
  // protected void addCorsMappings(CorsRegistry registry) {
  //    registry.addMapping("/**");
  //    super.addCorsMappings(registry);
  // }
}


2. ProcureInterceptor configuration

/**
 * @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("Request address uri:{}", uri);
        log.info("Request method:{}", request.getMethod());
        // Pre request
        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;
        }
        // Configure cross domain
        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("variable:{}", 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("Request received Origin For:{}", 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
 
    }
 
 
}


As shown in the figure above, this configuration is enough.

2018-10-23 optimization, which can be tested by swagger UI and static files

2019-01-22 optimization, local test can be passed at will. When Linux is online, there will be cross domain occasionally, but after repackaging, it can be passed again.

At present, no solution to this problem has been found.

(it may be related to Linux. After killing the process, if Enter goes online again until the prompt that the process is killed appears, it can pass.)
--------------------- 
Author: Uncle evil spirit
Source: CSDN
Original: https://blog.csdn.net/qq_/article/details/83058281
Copyright notice: This is the original article of the blogger. Please attach the link of the blog!

Topics: SpringBoot JSON Linux IntelliJ IDEA