如何实现页面的跨域访问,页面(ajax)跨域访问问题(JSONP与CORS两种实现方式)

目录

什么叫做跨域访问?

同源策略

跨域访问实现

方式一、JSONP

1.通过script中的src属性实现跨域

2.测试访问的JSON数据

3.手写回调函数

4.示例

JSONP方式的优化

方式二、CORS

1.添加CORS配置类

2.cors.json内容

3.尝试跨域访问(当前所在域名:www.wph.com,ajax跨域访问:www.manage.com)

最后


什么叫做跨域访问?

页面中的AJAX请求的域名与当前所在的域名不相同,违背了同源策略,这种访问方式叫做跨域访问

同源策略

在浏览器中发起AJAX请求时,需要同时满足三个条件,否则浏览器不予解析返回值:

  1. 请求的协议与当前协议相同 HTTP/HTTPS
  2. 请求的域名与当前域名相同
  3. 请求的端口与当期端口相同

跨域访问实现

 

方式一、JSONP

JSONP介绍

JSONP(JSON with Padding)是[JSON]的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
信息:  解决跨域/利用<javascrit>标签实现跨域.

1.通过script中的src属性实现跨域

<script type="text/javascript" src="http://www.manage.com/test.json"></script>

2.测试访问的JSON数据

test.json是json格式的一串数据

hello({"id":1,"name":"jack"})  

3.手写回调函数

function hello(data){
  console.log(data)
}

4.示例

<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>
<script type="text/javascript">
	function hello(data){
		console.log(data)
	}
</script><!-- 其实是相当于src=hello({"id":1,"name":"jack"})执行了hello函数 -->
<script type="text/javascript" src="http://www.manage.com/test.json"></script>
</head>

 

JSONP方式的优化

JQuery框架的AJAX函数帮我们做了优化,底层还是src,我们只需要使用即可

唯一遗憾的是它只支持GET请求

1.编辑AJAX函数(当前所在域名:www.wph.com,ajax跨域访问:www.manage.com)

 $.ajax({
            url:"http://www.manage.com/web/test",
            type:"get",             //jsonp只能支持get请求
            dataType:"jsonp",       //dataType表示返回值类型
            //jsonp: "callback",    //指定参数名称
            //#jsonpCallback: "hello",  //指定回调函数名称
            success:function (data){   //data经过jQuery封装返回就是json串
                alert("ajax跨域成功!!!!!");
                console.log(data.itemId);
                console.log(data.itemDesc);
                //转化为字符串使用
                //var obj = eval("("+data+")");
                //alert(obj.name);
            }   
        });

2.控制层代码

注意:如果为ajax的JSONP跨域请求,方法返回值必须是JSONPObject

 @RequestMapping("/web/test")
    public JSONPObject testJSONP2(String callback) {
        ItemDesc itemDesc = new ItemDesc();
        itemDesc.setItemDesc("测试数据");
        itemDesc.setItemId(10L);
        
        return new JSONPObject(callback, itemDesc);
    }
   /**手动拼写callback
   public String testJSONP(String callback) {
        
        ItemDesc itemDesc = new ItemDesc();
        itemDesc.setItemDesc("测试数据");
        itemDesc.setItemId(10L);
        String json = ObjectMapperUtil.toJSON(itemDesc);
        //需要手动的拼接json串
        return callback+"("+json+")";
    }*/

3.控制台结果

 

方式二、CORS

CORS介绍

CORS当下主流浏览器都支持.CORS跨域通过浏览器添加请求头信息实现的.同时服务器必须实现cors的接口才能实现跨域访问.

1.添加CORS配置类

@Configuration
public class CorsMVCConfig implements WebMvcConfigurer{
    
    //重写关于服务器跨域访问的策略
    @Override
    public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/**") //标识所有的请求可以跨域
                 .allowedOrigins("http://www.wph.com") //允许哪个网址访问 
                 .allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS","HEAD")   //请求类型
                 .allowCredentials(true) //是否允许携带cookie
                 //1.如果需要进行跨域访问,首先试探性的发起请求.(询问)
                 //如果服务器允许跨域则在一定的时间之内无需再次试探  默认30分钟
                 .maxAge(3600); //校验请求的有效期
    }
}

配置类在公共的工具项目下(common)

而项目中都依赖了这个common项目

2.cors.json内容

{"id":"1","name":"jack"}

3.尝试跨域访问(当前所在域名:www.wph.com,ajax跨域访问:www.manage.com

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试JSON跨域问题</title>
<script type="text/javascript" src="http://manage.jt.com/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript">
    /*$(){}结构必然是jQuery函数类库导入后才能正确执行*/
    $(function(){   //是因为jQuery类库定义了该函数(函数名称),所以可以被人调用
        alert("我执行了跨域访问");
        //利用jQuery发起AJAX请求
        $.get("http://www.manage.com/cors.json",function(data){
            alert(data.name);
        })
    })
</script>
</head>
<body>
    <h1>JSON跨域请求测试</h1>
</body>
</html>

 

最后

注意:JSONP与CORS是用户在页面发起的跨域请求,而HttpClient与Dubbo是在服务器内部的跨域请求

1.httpClient 万能的调用方式 访问任意的远程服务器,如果是业务层需要数据,一般首选httpClient.

【HttpClient调用流程图】

https://shimo.im/docs/JTY3cWW9Vh9k6yYy/ 《HttpClient的基本应用》

2.Dubbo方法远程调用 利用RPC技术实现远程调用. 调用远程服务器像调用本地服务一样. 只能完成系统内部的调用

【Dubbo调用流程图】

3.JSONP   利用JSONP能够实现跨域访问,要求服务器必须按照跨域的形式返回

【JSONP调用流程图】

4.如果是页面需要数据,一般首选jsonp/httpClient

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决 AJAX 问题的具体实现方式有多种,下面介绍其中的两种常用方式。 1. 通过 CORS CORS(Cross-Origin Resource Sharing,资源共享)是一种解决问题的标准,它可以使服务器支持请求。在服务器端,需要在响应头中设置 `Access-Control-Allow-Origin` 字段,允许指定的来源可以访问服务器资源。在客户端,只需要发送普通的 AJAX 请求即可。 例如,以下是使用 CORS 解决 AJAX 问题的代码示例: ```javascript var xhr = new XMLHttpRequest(); xhr.open('GET', 'http://example.com/api/data', true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { console.log(xhr.responseText); } } xhr.send(); ``` 2. 通过 JSONP JSONP(JSON with Padding)是一种通过动态创建 `<script>` 标签来实现请求的技术。在客户端,需要定义一个回调函数,服务器端返回的数据会作为参数传递给该回调函数。在服务器端,需要将数据包装成一个函数调用的形式返回给客户端。 例如,以下是使用 JSONP 解决 AJAX 问题的代码示例: ```javascript function handleResponse(response) { console.log(response); } var script = document.createElement('script'); script.src = 'http://example.com/api/data?callback=handleResponse'; document.body.appendChild(script); ``` 其中,`callback` 参数指定了回调函数的名称,服务器端返回的数据会作为该回调函数的参数传递。在客户端,需要定义一个与回调函数名称相同的函数,用于处理服务器端返回的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值