1、工作中遇到一个需求如下:
以前的项目都是每一个项目都有一个文件上传下载的功能,现在需要将文件上传下载的功能独立成一个单独的项目。
由不同的前端项目都来访问该项目来实现文件上传下载。
这里就遇到了一个跨域访问的问题。
本来@CrossOrigin(value = "域名")注解就能解决,但是需求想每次修改可以访问的域名时不用重启项目,只用将域名配置重新修改就可以生效。
我的解决办法
思路
1、将可访问的域名配置进file.properties文件
2、写一个过滤器,每次请求访问都取得请求头中的Origin属性,和配置文件中的配置的url对比,如果存在,则在响应中添加Access-Control-Allow-Origin属性。
@Component
public class CrossDomainFilter implements Filter{
private final static Logger log = LoggerFactory.getLogger(CrossDomainFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res= (HttpServletResponse) response;
check(req,res);
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
private void check(HttpServletRequest request,HttpServletResponse response) {
//加载properties文件,如果访问的域名在白名单中则添加到Access-Control-Allow-Origin属性中
ClassPathResource cr = new ClassPathResource("file.properties");
Properties properties = new Properties();
try {
properties.load(cr.getInputStream());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
log.info("properties:"+properties);
String [] allowDomain= properties.get("white-list").toString().split(",");
Set allowedOrigins= new HashSet(Arrays.asList(allowDomain));
String originHeader=request.getHeader("Origin");
log.info("originHeader:"+originHeader);
if (allowedOrigins.contains(originHeader)){
response.addHeader("Access-Control-Allow-Origin", originHeader);
}
}
}
如果大牛路过,欢迎指出错误!不胜感谢!





网友评论