美文网首页
Dubbo微服务项目中的ajax跨域请求问题

Dubbo微服务项目中的ajax跨域请求问题

作者: crossyf | 来源:发表于2019-10-22 14:50 被阅读0次

    1.问题描述

    最近在公司项目中,使用dubbo微服务框架开发,在多个项目之间相互调用的时候出现了ajax跨域调用的问题,具体的问题就是,dubbo多模块项目,不同的业务分别在不同的子项目中,比如订单相关的在order模块中,商品相关的在product模块中,那么在前端新增订单时候需要获取商品数据的时候用ajax直接访问product模块中相关的方法的时候就会报错,因为这时候orderproduct在本地的项目名和端口都是不同的,不能直接进行跨域访问。

    跨域问题.png

    2.问题分析

    跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。
    同源:指的是域名、协议、端口都相同
    在项目中,我在product项目的地址是http://localhost:93/product-web,order项目的地址是http://localhost:94/order-web属于跨域。

    3.解决办法

    跨域问题的解决方案有多种,本次采用的是后端服务开放跨域请求的方法。
    结合具体项目,介绍解决方法。
    后端开放跨域请求主要是拦截请求,给HTTP请求添加Header。具体代码如下

            res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
            res.setHeader("Access-Control-Allow-Credentials", "true");
            res.setHeader("Access-Control-Allow-Headers", "accept,content-type,x-requested-with,Origin");
            res.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,DELETE,PUT");
    

    一般设置好就可以正常访问了,但是我测试的出现下面问题


    调用报错.png

    实际上是由于请求没有携带cookie信息导致的后台逻辑没有走通(单一登录根据cookie验证是否登录)
    非同源请求默认不携带cookie信息的,如果想要请求中携带cookie信息,需要在ajax请求中添加以下参数

    $.ajax({
                type: "POST",
                url: "${ctxOrderUrl}/loginPurchase/getUnit",
                async: false,
                xhrFields:{
                    withCredentials:true
                },
                success: function (result) {
                   
                }
            });
    

    这时候请求就不会有问题了。

    相关文章

      网友评论

          本文标题:Dubbo微服务项目中的ajax跨域请求问题

          本文链接:https://www.haomeiwen.com/subject/mngfvctx.html