package com.jlpay.agent.query.framework.mvc.filter;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 自定义拦截器配置
*
* @Author: heyaolei
* @Date: 2021/11/5
*/
@Slf4j
@Configuration
public class FilterConfiguration {
/**
* 可选字段,布尔值类型,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中;如果设为true,即表示服务器允许在请求中包含Cookie,一起发给服务器。
* 注意该值只能设为true,如果服务器不允许浏览器发送Cookie,删除该字段即可。
*/
@Value("${jlpay.business.filter.allowCredentials:true}")
private boolean allowCredentials;
/**
* 可选字段,CORS请求时默认支持6个基本字段,XMLHttpRequest.getResponseHeader()方法:
* Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
* 如果需要支持其他Headers字段,必须在Access-Control-Allow-Headers里面指定。
*/
@Value("${jlpay.business.filter.allowedHeader:*}")
private String allowedHeader;
/**
* 必填字段,支持的跨域请求的方法
*/
@Value("${jlpay.business.filter.allowedMethod:*}")
private String allowedMethod;
/**
* 必填字段,接受任意域名的请求
*/
@Value("${jlpay.business.filter.allowedOrigin:*}")
private String allowedOrigin;
@Value("${jlpay.business.filter.corsPath:/**}")
private String corsPath;
/**
* 跨域请求配置
*
* @return
*/
private CorsConfiguration buildCorsConfig() {
CorsConfiguration corsConfig = new CorsConfiguration();
corsConfig.setAllowCredentials(allowCredentials);
corsConfig.addAllowedHeader(allowedHeader);
corsConfig.addAllowedMethod(allowedMethod);
//指定域名拦截配置
if (!StringUtils.isEmpty(allowedOrigin) && !CorsConfiguration.ALL.equals(allowedOrigin)) {
String[] originArr = allowedOrigin.split(",");
for (String origin : originArr) {
corsConfig.addAllowedOrigin(origin);
}
} else {
corsConfig.addAllowedOrigin(CorsConfiguration.ALL);
}
return corsConfig;
}
/**
* 跨域请求过滤器配置
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
//注:暂定所有接口均允许跨域,建议针对具体接口配置允许跨域
configSource.registerCorsConfiguration(corsPath, buildCorsConfig());
log.info("跨域请求过滤器配置:{}", JSONObject.toJSONString(configSource.getCorsConfigurations()));
return new CorsFilter(configSource);
}
/**
* 跨域请求配置注册至过滤器
*
* @return
*/
@Bean
public FilterRegistrationBean corsFilterRegist() {
FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
filterRegistration.setFilter(corsFilter());
filterRegistration.setName("corsFilter");
return filterRegistration;
}
}