跨域问题其实很广泛的存在的,如何解决跨域问题呢,跨域问题究竟是怎么产生的,解决方法的由来又是什么?我以为看了视频讲解,值得写下来,记录下来。ajax
1、跨域问题是怎么产生?spring
概念:只要协议、域名、端口有任何一个不一样,都被看成是不一样的域。json
浏览器对ajax请求的限制,不容许跨域请求资源。后端
http://www.a.com →http://www.b.com 是跨域api
http://www.a.com→ http://www.a.com:8080 是跨域跨域
http://a.a.com →http://b.a.com 是跨域浏览器
http://www.a.com →http://www.a.com/api 不是app
解决方案:---jsonpjsp
2、跨域问题的底层是怎么回事?(推导一下)函数
一、编写json.jsp(后台系统)
二、在后台系统中编写test-json.htm
三、将test-json.htm 拷贝到前台系统进行测试
发现:
一、 alert($) 能够正常弹出
二、 alert(data.abc) 不可以正常的弹出,出现跨域问题
结论:script标签的src能够跨域请求资源,可是ajax请求不能够跨域请求。
疑问:可否借助script标签的src进行加载数据? --能够的。
四、借助script的src跨域加载资源
发现:
请求资源能够正常请求,可是,报js解析出错。
缘由:
Script标签加载到资源后,会将资源当作是js脚本解析,可是咱们返回的是json数据,因此致使解析失败。
解决:只须要返回js脚本便可。
五、后端系统返回JS脚本
测试:
发现:
返回的js脚本成功解析,可是,fun没有定义。
解决:定义个一个fun方法便可。
六、定义fun方法
测试:
总结:
Jsonp的原理:
一、 jsonp经过script标签的src能够跨域请求的特性,加载资源
二、 将加载的资源(经过一个方法名将数据进行包裹)当作是js脚本解析
三、 定义一个回调函数,获取传入的数据
七、优化
将回调函数名传递到服务端,返回:
调用方:
八、经过jQuery使用jsonp请求
3、解决项目中跨域问题的方案是什么?
一、后台系统Controller
二、测试
问题解决,可是带来了新问题,乱码问题。
三、解决乱码问题
3.1 乱码产生的缘由
在SpringMVC中产生的响应有2类:
(1) ModelAndView
(2)返回数据响应:使用消息转化器完成
找到这个类:StringHttpMessageConverter.class
默认使用的字符串消息转换器:发现,默认使用ISO-8859-1,因此会产生乱码。
3.2 解决乱码
四、统一支持jsonp
(1) 扩展CallbackMappingJackson2HttpMessageConverter
(2)配置
(3)Controller实现
总结:经过这个学习,知道了乱码问题的另外一个缘由以及解决方案,原来注解驱动也是能够配置的,看来是本身对springMVC的理解只是存在于表面上,spring的配置文件真的很强大,能很好的解决代码耦合度太高的问题,还可以很好的优化代码,之后这方面真的须要深刻的学习,经过视频中项目的讲解,差很少可以把一些线程池,链接池的代码转换成spring的配置文件,你须要更加深刻的学习。