跨域请求的cookie处理

跨域名的情况下未测试,目前遇到的是跨端口的情况,以下解决方案在跨端口情况下测试通过

现有两个项目,项目A是主项目,路由为localhost;项目B是子项目,路由为localhost:8080

需要实现的业务为:A是主项目,系统入口也是从A进入,用户登录状态保存在缓存中,生成uuid(作为登录状态的key)保存到cookie中;要求在A中要嵌入使用B的一些业务,B项目中用户登录信息直接从缓存中获取,所以需要能在B项目中取到A项目保存到cookie中的uuid值

1)ajax请求添加以下参数

ps:基于jquery,定义casLoad,casPost,casGet方法,具体内容参考末尾

xhrFields: {
    withCredentials: true
},
crossDomain: true

2)B项目中,允许被跨域的controller层添加拦截器,拦截器功能:在response中设置Header内容

HttpServletRequest request = controller.getRequest();
String origin = request.getHeader("Origin");
origin = StringUtil.isNullOrEmpty(origin) ? "*" : origin;

HttpServletResponse response = controller.getResponse();
response.setHeader("Access-Control-Allow-Origin", origin);
response.setHeader("Access-Control-Allow-Methods", "POST, GET");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
response.setHeader("Access-Control-Allow-Credentials", "true");

ajax.cross.js

//@ sourceURL=ajax.cross.js
;
(function ($, window) {
    //取代$.fn.load,并兼容非跨域情况,如果url包含http:,则直接调用load方法
    //$('#div').crossLoad('http://xxx/xxx/xxx')跨域请求
    //$('#div').crossLoad('/xxx/xxx/xxx')等同于$('#div').load('/xxx/xxx/xxx')
    $.fn.crossLoad = function (url, data, callback) {
        if (url.indexOf('http:') >= 0) {
            if (typeof data === 'function') {
                callback = data;
                data = undefined;
            }
            new CrossAjax($(this), 'load', {url: url, data: data, callback: callback});
            return this;
        } else {
            return this.load(url, data, callback);
        }
    };

    //取代$.get,兼容非跨域情况
    //$.crossGet('http://xxx/xxx/xxx')跨域请求
    //$.crossGet('/xxx/xxx/xxx')等同于$.get('/xxx/xxx/xxx')
    $.crossGet = function (url, data, callback) {
        if (url.indexOf('http:') >= 0) {
            if (typeof data === 'function') {
                callback = data;
                data = undefined;
            }
            new CrossAjax(null, 'get', {url: url, data: data, callback: callback});
        } else {
            jQuery.get(url, data, callback);
        }
    };

    $.crossPost = function (url, data, callback) {
        if (url.indexOf('http:') >= 0) {
            if (typeof data === 'function') {
                callback = data;
                data = undefined;
            }
            new CrossAjax(null, 'post', {url: url, data: data, callback: callback});
        } else {
            jQuery.post(url, data, callback);
        }
    };

    var CrossAjax = function (ele, method, opt) {
        this.self = ele;
        this.settings = opt;
        this.method = method;
        this.crossAjax();
    };

    CrossAjax.DEFAULT = {
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true
    };

    CrossAjax.prototype = {
        crossAjax: function () {
            var that = this;
            that.optInit();

            var self = that.self, response, isLoad = that.isLoad || false;
            var callback = that.settings.callback;
            var url = that.settings.url;

            var off = url.indexOf(" "), selector;
            if (off >= 0) {
                selector = url.slice(off, url.length);
                url = url.slice(0, off);
                that.option.url = url;
            }

            console.log(that.option);

            jQuery.ajax(that.option).done(function (responseText) {
                if (isLoad) {
                    // Save response for use in complete callback
                    response = arguments;

                    self.html(selector ?
                        // If a selector was specified, locate the right elements in a dummy div
                        // Exclude scripts to avoid IE 'Permission Denied' errors
                        jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :

                        // Otherwise use the full result
                        responseText);
                }
            }).complete(function (jqXHR, status) {
                if (isLoad) {
                    callback.apply(this, arguments);
                    self.each(callback, response || [jqXHR.responseText, status, jqXHR]);
                }
            });
        },
        optInit: function () {
            //ajax参数初始化
            var that = this, settings = that.settings;
            var url = settings.url, method = that.method || 'get', data = settings.data, callback = settings.callback;

            var isLoad = method === 'load';
            that.isLoad = isLoad;

            var type = method === 'get' ? 'GET' : 'POST';
            if (isLoad) {
                type = data && typeof data === 'object' ? 'POST' : 'GET';
            }

            var opt = {
                url: url,
                type: type,
                dataType: isLoad ? 'html' : 'json',
                data: data
            };

            if (!isLoad) {
                opt.success = callback;
            }

            that.option = $.extend({}, CrossAjax.DEFAULT, opt);
        }
    };

})(jQuery, window);

转载于:https://my.oschina.net/doubleTing/blog/3006364

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值