加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

跨域问题及解决方案(jsonp)

发布时间:2020-12-16 19:48:13 所属栏目:百科 来源:网络整理
导读:一:什么是跨域? 跨域是指的浏览器跨域,由于同源策略的限制,无法共享不同域名的资源(所谓的同是指域名相同,协议相同,端口相同),不同域名之间,或同一域名不同端口之间无法互相访问,典型的报错如下: 二.实例 该项目前后台系统分离,并且前台系统的门

一:什么是跨域?

跨域是指的浏览器跨域,由于同源策略的限制,无法共享不同域名的资源(所谓的同是指域名相同,协议相同,端口相同),不同域名之
间,或同一域名不同端口之间无法互相访问,典型的报错如下:

二.实例

该项目前后台系统分离,并且前台系统的门户和服务层是分开的,如下图(多设备可共用服务层),这就意味
着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的封装

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读