遇到的一个关于ajax跨域的问题

首先说下几个解决方案:javascript

1.jsonp前端

2.CORSjava

3.代理jquery

4.iframeajax

 

这里说一下 1 2 4 我遇到的问题json

1.jsonp 实际原理是加载远程js,因此返回的数据是一个能够执行的javasript代码,很明显若是你返回一段字符串 浏览器报错 .跨域

2.cors 在服务器端 填写 (response.setHeader("Access-Control-Allow-Origin","* "));浏览器

在后台中禁止使用跳转重定向 浏览器报错 302安全

4.iframe 加载一个的页面 须要在每一个链接上加上远程服务器地址 好比 咱们通常写/  这样的话 会默认执行location的地址  就是浏览器中的地址 很明显 会出现各类问题服务器

 

***

网上有不少博客,我在这里说写本身的体会 说点不同的

***

jsonp 是jquery 封装的一个ajax

在定义ajax的时候 须要jsoncallback参数

不少博文里面会写到修改服务器的返回值  返回值是  callback+(返回值)

这里有两点注意

一 是必定要写上callback 这个方法名 这东西能够前台自定义 若是没有jquery自动生成一个惟一方法名称

二 是返回值是符合jsonp格式的

这两点 太让人难受了

由于不少系统是多方开发的  没谁配合你修改这 修改那里

那怎么办呢?

这里给你们说一下个人解决办法

首先 这个是jquery封装的

那么你们能够看一下jquery的源代码  进行修改

或者重写代码

// Callback for when everything is done
		function done( status, nativeStatusText, responses, headers ) {
			............................
					isSuccess = ajaxConvert( s, response );// 这里对服务器的响应数据进行转换
					statusText = isSuccess.state;
					success = isSuccess.data;
					error = isSuccess.error;
					isSuccess = !error;



// Chain conversions given the request and the original response
function ajaxConvert( s, response ) {
	....
...
				if ( conv !== true ) {

					// Unless errors are allowed to bubble, catch and return them
					if ( conv && s["throws"] ) {
						response = conv( response );
					} else {
						try {
							response = conv( response );// 这里对服务器的响应数据进行转换
						} catch ( e ) {
							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
						}
					}
				}
			}

这里conv( response );会执行
// Install script dataType
jQuery.ajaxSetup({
	accepts: {
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
	},
	contents: {
		script: /(?:java|ecma)script/
	},
	converters: {
		"text script": function( text ) {
			jQuery.globalEval( text );
			return text;
		}
	}
});
converters 方法

这里 的text 就是服务器响应内容  看到这里 你们是否是明白了?
在前端获得了数据  想怎么编辑数据均可以了

			jQuery.globalEval( text ); // 执行javascript代码  固然你能够不执行
// alert(123)
// var o =JSON.parse(text); alert(o.msg);
so ....

 

后续遇到的问题

用于单点登陆

关于跨域cookie的写入问题

看了好多博文都没弄明白

这里说下两个解决办法

1. 用jsonp 跨域请求  服务器 设置cookie  response.addCookie

2.用iframe跨域网站  得到页面代码 设置cookie

3.a获得b站的凭证(须要保存的cookie)以后 跳转b站的时候 当作参数再传回去 b站响应的时候 在设置cookie

4.a站跳转到b站的一个中间页面 好比欢迎回来  继续跳转 这样的页面  这个页面添加b站cookie 而且重定向到b站要访问的页面  缺点很明显  就是须要中间过渡页面

 

我用的是第三种办法

前面两种收到大坑框架限制  

坑1: ajax cookie 设置了安全访问限制 须要https

坑2: iframe 设置了同源访问权限  也就是说跨域不能访问

相关文章
相关标签/搜索