@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Bean
public SecutityInterceptor securityInterceptor() {
return new SecutityInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(securityInterceptor()).addPathPatterns("/**").excludePathPatterns("/login/**");
}
@Override
protected void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).
allowedMethods("GET", "POST", "PUT", "DELETE").maxAge(3600);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.removeIf(converter -> converter instanceof MappingJackson2HttpMessageConverter);
converters.add(fastJsonHttpMessageConverter());
}
/**
* fastJson相关设置
*/
private FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<MediaType>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(supportedMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(getFastJsonConfig());
return fastJsonHttpMessageConverter;
}
/**
* fastJson相关设置
*/
private FastJsonConfig getFastJsonConfig() {
FastJsonConfig fastJsonConfig = new FastJsonConfig();
// 在serializerFeatureList中添加转换规则
List<SerializerFeature> serializerFeatureList = new ArrayList<SerializerFeature>();
serializerFeatureList.add(SerializerFeature.PrettyFormat);
serializerFeatureList.add(SerializerFeature.WriteMapNullValue);
serializerFeatureList.add(SerializerFeature.WriteNullStringAsEmpty);
serializerFeatureList.add(SerializerFeature.WriteNullListAsEmpty);
serializerFeatureList.add(SerializerFeature.DisableCircularReferenceDetect);
SerializerFeature[] serializerFeatures = serializerFeatureList.toArray(new SerializerFeature[0]);
fastJsonConfig.setSerializerFeatures(serializerFeatures);
return fastJsonConfig;
}
}
/**
* 权限拦截器
*/
@Slf4j
public class SecutityInterceptor implements HandlerInterceptor {
/**
* 在调用controller具体方法前拦截
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestUri = request.getRequestURI();
String contextPath = request.getContextPath();
String url = null;
if(StringUtils.isNotBlank(requestUri) && StringUtils.isNotBlank(contextPath)){
url = requestUri.substring(contextPath.length());
}
//打印出请求url及参数
if(log.isInfoEnabled()){
Map<String, String[]> params = request.getParameterMap();
StringBuilder sb = new StringBuilder();
if(params != null && !params.isEmpty()){
for(Map.Entry<String, String[]> pe: params.entrySet()){
if(sb.length() > 0) sb.append(", ");
sb.append(pe.getKey()).append("=").append(Arrays.toString(pe.getValue()));
}
}
log.info("url: " + url + "------request parameters: " + sb.toString());
}
//处理前端发送options出现跨域问题
if(request.getMethod().equalsIgnoreCase("OPTIONS")) {
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setStatus(HttpServletResponse.SC_OK);
return true;
}
return true;
}
/**
* 在调用controller具体方法后拦截
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 完成页面的render后调用
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}