首页 > 其他 > 详细

aiax跨域问题

时间:2020-08-17 22:34:03      阅读:80      评论:0      收藏:0      [点我收藏+]

aiax跨域问题

问题说明

假如我们有两个项目, 域名分别为 www.jt.com (web前端项目)manager.jt.com (后端项目)

第一个项目中前端页面发送ajax请求到第二个项目中去处理, 显然是不成功的.

同源策略

同源策略针对的是ajax, 对a标签或script标签等无效

浏览器中规定Ajax请求协议, 域名, 端口三者必须全部相同时,才能实现数据访问(同域请求),如果违反上述规则中的任意一个则该请求就是跨域访问.
如果浏览器进行跨域访问,则浏览器不予解析返回值.

也就是说, a标签跳转可以跳转到任何url页面, script也可以引入其他CDN网站的js文件, 但是ajax无法对其他应用的服务器发送请求

js跨域实现思路及原理

思路

既然script标签可以跨域, 是否可以间接使用script标签实现跨域呢?

jsonp的跨域实现就是这个原理

JSONP跨域的实现

  1. 利用script中的src属性进行跨域!!!
<script type="text/javascript" src="http://manager.jt.com/test.json"></script>

补充说明:一般src属性负责资源的加载.如果 需要使用数据,则需要函数进行调用才行.

  1. 自定义回调函数, 例如: (data参数为接收的json数据)

此代码需要放到对应的script标签上面, 不然请求会失败

<script type="text/javascript">
    /*JS是解释执行的语言  */
    /*定义回调函数  */
    function hello(data){
        alert(data.name);
    }
</script>
  1. 将返回值的结果 进行特殊的格式封装!!!
hello({"id":"1","name":"tom"})

案例就此完毕!

完整代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>测试JSON跨域问题</title>	
        
        <script type="text/javascript">
            /*JS是解释执行的语言  */
            /*定义回调函数  */
            function hello(data){
                alert(data.name);
            }
        </script>
        <!--  其他域名下的json请求, 该json一直保存到浏览器中等待调用,但是没有函数名称无法调用  -->
        <script type="text/javascript" src="http://manager.jt.com/test.json"></script>
        <!-- 引入JQuery -->
        <script type="text/javascript" src="http://manager.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
        </script>
    
    </head>

    <body>
        <h1>JS跨域问题</h1>
    </body>
</html>

这样就实现了请求的跨域, 也是js实现跨域的原理和思路

JSONP介绍

艺名:json"胖"
JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

jQuery实现JSONP

需求:jsonp的方式如果采用原生的调用方式,则配置繁琐 1.javascript 2.自定义回调函数 3.特殊格式封装.
则jQuery负责封装JSONP.像常规ajax调用一样的方便.
页面封装:

1. JQuery代码如下

$(function(){
    $.ajax({
        url:"http://manager.jt.com/web/testJSONP",
        type:"get",				//jsonp只能支持get请求   因为src只能进行get请求.
        dataType:"jsonp",       //dataType表示返回值类型 必须标识
        //jsonp: "callback",    //指定参数名称
        //jsonpCallback: "hello",  //指定回调函数名称
        success:function (data){   //data经过jQuery封装返回就是json串
            alert(data.id);
            alert(data.name);
        }
    });	
}

jsonp请求会附带一个参数callback, 此参数记录的就是跨域请求回调的函数名, 类似于上面jsonp案例中的hello函数

2. 对应的controller

@RestController
public class JSONPController {

    /**
     * 完成JSONP的调用
     * url:http://manager.jt.com/web/testJSONP?callback=jQuery111101021758391465013_1597656788213&_=1597656788214
     * 规定:返回值结果,必须经过特殊的格式封装.callback(json)
     */
    @RequestMapping("/web/testJSONP")
    public String  jsonp(String callback){

        return callback+"({‘id‘:‘100‘,‘name‘:‘tomcat猫‘})";
    }

}

aiax跨域问题

原文:https://www.cnblogs.com/zpKang/p/13520003.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!