跨域问题及解决方案(jsonp)
一:什么是跨域?
跨域是指的浏览器跨域,由于同源策略的限制,无法共享不同域名的资源(所谓的同是指域名相同,协议相同,端口相同),不同域名之 间,或同一域名不同端口之间无法互相访问,典型的报错如下:
二.实例
该项目前后台系统分离,并且前台系统的门户和服务层是分开的,如下图(多设备可共用服务层),这就意味 着portal(门户)和服务层是两个独立的项目,发布时会使用不同的域名或是同一域名下的不同端口,假设我 们使用同一域名下的8081端口发布服务层项目,使用8082端口发布门户项目
URL_Serv: "http://localhost:8081/category.json" //在门户项目中使用ajax请求json数据,服务端如果直接返回数据给客户端(8081端口---->8082端口) $.getJSON(this.URL_Serv, function(json){ category.getDataService(json); });
js报错:(跨域问题)
三.解决方案
jsonp方式简介
JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。
JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。
jsonp原理图
jsonp实现
(1)前端方案一:动态创建<script>标签,设置其src,回调函数在src中设置:
var script = document.createElement("script"); script.src = "https://api.douban.com/v2/book/search? q=javascript&count=1&callback=handleResponse"; document.body.insertBefore(script, document.body.firstChild); <script type="text/javascript"> function handleResponse(response){ console.log(response); } </script>
(2)前端方案二:利用getJSON来实现,只要在地址中加上callback=?参数即可
$.getJSON("https://api.douban.com/v2/book/search?q=javascript&count=1&callback=?", function(data){ console.log(data); });
controller层
返回的JSON作为参数传入回调函数中
方式一: @Controller public class ItemCatController { @Autowired private ItemCatService itemCatService; @RequestMapping(value="/itemcat/list", produces=MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8") @ResponseBody public String getItemCatList(String callback) { CatResult catResult = itemCatService.getItemCatList(); //把pojo转换成字符串 String json = JsonUtils.objectToJson(catResult); //拼装返回值 String result = callback + "(" + json + ");"; return result; } } 其中:produces=MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8" 是用来解决乱码
方式二: @RequestMapping("/itemcat/list") @ResponseBody public Object getItemCatList(String callback) { CatResult catResult = itemCatService.getItemCatList(); MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(catResult); mappingJacksonValue.setJsonpFunction(callback); return mappingJacksonValue; } 通过spring4.0提供的工具类自动完成js的封装
相关推荐
somebodyoneday 2020-03-06
fengchao000 2020-03-05
zmosquito 2020-05-10
somebodyoneday 2020-04-22
fengchao000 2020-04-22
fengchao000 2020-04-11
xiaouncle 2020-02-13
fengchao000 2020-06-17
adonislu 2020-05-16
adonislu 2020-05-10
Richardxx 2020-03-07
somebodyoneday 2020-02-16
baijinswpu 2020-01-29
fengchao000 2020-01-10
fengchao000 2019-12-25
newthon 2019-12-23
somebodyoneday 2013-07-11