跨域名的情况下未测试,目前遇到的是跨端口的情况,以下解决方案在跨端口情况下测试通过
现有两个项目,项目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);