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 {這種方式啓動正常。。