Spring cloud zuul跨域

Posted hanjun0612

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring cloud zuul跨域相关的知识,希望对你有一定的参考价值。

项目背景:
我们有web和大屏,以及移动端,需要访问微服务接口。

然而大屏时自己打开的网页,在网页中通过js调用我的webapi。出现了跨域情况。

 

原因:
出现这个问题,是由于跨域请求有2次请求。

第一次:options(查看请求可用性,确定请求后端是否支持请求类型)
技术图片

第二次:才是你的真实请求。(get/post...)

技术图片

解决方案:

PreFilter

/**
 * zuul转发前过滤器
 */
@Component
public class PreFilter extends ZuulFilter {
    public PreFilter() {
        super();
    }
 
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }
 
    @Override
    public int filterOrder() {
        return 0;
    }
 
    @Override
    public boolean shouldFilter() {
//        return true;
 
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        //只过滤OPTIONS 请求
        if(request.getMethod().equals(RequestMethod.OPTIONS.name())){
 
            return true;
        }
        return false;
    }
 
    @Override
    public Object run() {
 
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        HttpServletResponse response = ctx.getResponse();
 
        response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials","true");
        response.setHeader("Access-Control-Allow-Headers","authorization, content-type");
        response.setHeader("Access-Control-Allow-Methods","POST,GET");
 
        String requestUrl = request.getRequestURL().toString();
        String requestUri = request.getRequestURI();
        String zuul = requestUrl.substring(0,requestUrl.indexOf(requestUri)); // zuul根路径
        ctx.addZuulRequestHeader("zuul", zuul);
        //不再路由
        ctx.setSendZuulResponse(false);
        ctx.setResponseStatusCode(200);
 
        return null;
    }
    
    
    
}

PostFilter(这个可以不要)

@Component
public class PostFilter extends ZuulFilter {
    protected static final String SEND_ERROR_FILTER_RAN = "sendErrorFilter.ran";
 
    @Override
    public String filterType() {
        return FilterConstants.POST_TYPE;
    }
 
    @Override
    public int filterOrder() {
        return -1;
    }
 
    @Override
    public boolean shouldFilter() {
        return true;
    }
 
    @Override
    public Object run() {
 
        return null;
    }
}

解决思路:让options 请求进入过滤后,允许跨域。

以上是关于Spring cloud zuul跨域的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Spring Cloud 构建微服务系统:API服务网关(Zuul)

最全面的改造Zuul网关为Spring Cloud Gateway(包含Zuul核心实现和Spring Cloud Gateway核心实现)

Spring Cloud 微服务二:API网关spring cloud zuul

Spring Cloud Zuul 综合使用

7Spring -Cloud-路由网管Spring Cloud Zuul

spring cloud:Edgware.RELEASE版本中zuul回退方法的变化