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直到出現此進程被殺的提示後,重新上線,即可過)