基于Springboot的跨域问题处理
问题
- 不同域名的情况下 浏览器做客户端时请求接口时浏览器console和network会产生的Cors相关异常抛出
- 针对IOS 12对response的header:Access-Control-Allow-Headers无法为*的问题处理
- 一些app客户端开发时其浏览器内核版本不同也会有不同
处理
处理代码
//todo origin需要手动写入
httpServletResponse.setHeader("Access-Control-Allow-Origin", "https://xxx.xxx");
//针对IOS12 配置允许的请求头
StringBuilder headers = new StringBuilder();
Enumeration<String> headerNames = httpServletRequest.getHeaders("Access-Control-Request-Headers");
if(Objects.nonNull(headerNames)) {
while (headerNames.hasMoreElements()) {
if(StrUtil.isBlank(headers.toString())){
headers.append(headerNames.nextElement());
}else{
headers.append(",").append(headerNames.nextElement());
}
}
}
httpServletResponse.setHeader("Access-Control-Allow-Headers", headers.toString());
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
httpServletResponse.setHeader("Access-Control-Max-Age", "86400");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())
&& httpServletResponse.getStatus() != HttpServletResponse.SC_NO_CONTENT) {
httpServletResponse.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
代码分析
- 需要将此代码放到过滤器中进行处理
- OPTIONS请求需要响应204状态码以及对应的头
- Access-Control-Allow-Origin不推荐用*,需要把允许的域名进行配置,如前端客户端域名、浙里办客户端域名等。
代码生效验证
随便找一个后端的接口进行测试
1、GET/POSET postman校验
此处响应的headers中下面5个Access开始的头和代码对应且请求Status都是200
2、OPTIONS postman校验
此处响应的headers中下面5个Access开始的头和代码对应且请求Status都是204