双重跨域问题处理
目录双重跨域问题处理1、问题出现的业务场景所在微服务系统引入网关服务,通过网关服务调用原微服务系统,调用异常前端异常信息如下:The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:8080,http://localhost:8080 *', but only one is allowe
目录
1、问题出现的业务场景
所在微服务系统引入网关服务,通过网关服务调用原微服务系统,调用异常
前端异常信息如下:
The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:8080,http://localhost:8080 *', but only one is allowed.
该属性只允许被设置为一个,但是目前有多个
2、问题原因
2.1、nginx设置了Access-Control-Allow-Origin,可能会导致该问题
2.2、zuul网关和被调用的服务都设置了跨域的配置,针对Access-Control-Allow-Origin有对应的设置,会导致双重跨域
2.3、gateway网关和被调用的服务设置了跨域配置,针对Access-Control-Allow-Origin有对应的设置,会导致双重跨域
3、处理方案
1、合理配置跨域 删除多余配置即可
2、网关层做相关配置
gateway的处理
spring:
main:
allow-bean-definition-overriding: true
gateway:
discovery: #是否与服务发现组件进行结合,通过 serviceId(必须设置成大写) 转发到具体的服务实例。默认为false,设为true便开启通过服务中心的自动根据 serviceId 创建路由的功能。
locator: #路由访问方式:http://Gateway_HOST:Gateway_PORT/大写的serviceId/**,其中微服务应用名默认大写访问,配置lowerCaseServiceId可用小写。
enabled: true
lowerCaseServiceId: true
#解决跨域问题
globalcors:
corsConfigurations:
'[/**]':
# 允许携带认证信息
allow-credentials: true
# 允许跨域的源(网站域名/ip),设置*为全部
allowedOrigins: "*"
# 允许跨域的method, 默认为GET和OPTIONS,设置*为全部
allowedMethods: "*"
# 允许跨域请求里的head字段,设置*为全部
allowedHeaders: "*"
#解决双重跨域 RETAIN_FIRST RETAIN_LAST RETAIN_UNIQUE
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials Vary, RETAIN_UNIQUE
————————————————
版权声明:本文为CSDN博主「chenshiying007」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_27384769/article/details/108375731
zuul的处理
3、nginx配置
去掉nginx多余配置
add_header 'Access-Control-Allow-Origin' '*';
4、项目代码拦截器的设置
package gentle.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 解决跨域设置
* (可把此设置放在 nginx 中,但只能设置一处)
*
* @author silence
* @date 2018/12/11 15:19
*/
@WebFilter(filterName = "requestFilter", urlPatterns = {"/*"})
public class RequestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
// 此处 setHeader、addHeader 方法都可用。但 addHeader时写多个会报错:“...,but only one is allowed”
// response.setHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
// 解决预请求(发送2次请求)
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Cache-Control,Pragma,Content-Type,Token, Content-Type");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
String method = request.getMethod();
if (method.equalsIgnoreCase("OPTIONS")) {
servletResponse.getOutputStream().write("Success".getBytes("utf-8"));
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
更多推荐
所有评论(0)