JSONP技术

一、跨域问题:

1、同源策略(SOP):

  • 访问浏览器的URL地址和发送XHR请求的URL地址必须满足三个一致:协议一致、域名 一致、端口一致。

  • 同源策略规定:如果访问浏览器的URL地址和发送XHR请求的URL地址不同源,则无法 发送XHR请求(Ajax请求),会产生跨域问题。

2、跨域问题:是浏览器的安全级别造成的。
3、模拟跨域:

  • 在本地产生两个服务器:

    • (1)客户端通过Hbuilder访问。
    • (2)服务端通过自身的服务器实现。

二、JSONP技术:

  • 通过浏览器发送的请求被称为“http请求”,其中包括资源请求、表单请求、XHR请求。
    1、通过不向服务器发送XHR请求的方法来解决跨域问题。此时JSONP要求浏览器向服务器发送一个资源请求。
    2、什么是资源请求:通过HTML标记向服务器请求的外部文件就是资源请求。
例:<script></script>、<link />、<img />、<audio></audio>、<video></video>等。

3、哪个标记可以帮助我们将后台文件(.jsp、.php、.axpx)的请求变为资源请求?

<script type=“text/javascript” src=“http://localhost:8080/ajax/index.jsp”></script>

例1: 利用资源请求方式向服务器申请一个空的jsp文件。

  • 通过开发人员工具的Network选项卡,可以看出,此时对jsp文件的请求已经无法
    通过XHR筛选出来,同时可以通过js筛选出来。
  • 说明此时对jsp文件的请求是一个资源请求。

例2: 向后台的jsp文件书写一些JavaScript代码,看看是否能够被响应。
能够被响应。

例3: 如果在前端写一个funciton,后台能不能调用呢?
可以调用。

  • 前端代码:function abc(www){ alert(www); }
  • 后台代码:<% String str=“欢迎使用JSONP技术” %>
    abc(“<%=str%>”);

结论:通过资源请求浏览器可以得到服务器的响应文本

4、如何通过资源请求向服务器传递参数?

例4: 向服务器传递一个参数,并返回该参数+100之后的结果。
可以将向服务器传递的参数书写在资源请求的地址末尾。

 <script src=“http://localhost:8080/ajax/index.jsp?m=25&n=30> </script>

后台代码:

 <%
 int m=Integer.parseInt(request.getParameter("m"));
 int n=Integer.parseInt(request.getParameter("n"));
 int result=m+n;
 %>

 hello(<%=result%>)

5、人们认为,按照如下的格式书写JSONP代码更加符合编程的思想:
问题:前端定义的函数后台要调用,那么函数名前后台要商量好。
解决:将前端的函数名也作为一个普通参数传递给服务器,参数名为cb或callback。
前端代码:

  function www(res){ console.log(res); }
  <script src=“http://localhost:8080/ajax/index.jsp?cb=www&……”> </script>

后台代码:

 <%
         String fun=request.getParameter(“cb”);
%>
        <%=fun%>(实参)

三、原生JavaScript下的JSONP技术应用:

//让后台调用下列函数

var result;
function getData(res){
	result=res;
}

btn.onclick=function(event){
	event.preventDefault();
	//获取文本框中的数据
	var exno=document.forms[0].exno;
	var exname=document.forms[0].exname;
	
	//动态创建对服务器文件的资源请求
	var script=document.createElement("script");
	script.type="text/javascript";
	script.src="http://localhost:8080/ajax/checkGrade.jsp?cb=getData&exno=" + exno.value + "&exname=" + exname.value;
	document.body.appendChild(script);
	
	//对后台响应的文本进行分析
	script.onload=function(){
		if(result.code==="1"){
			alert("您的成绩:" + result.grade);
		}else{
			alert("没有查询到您的考生成绩");
		}
	}
}

四、jQuery下的JSONP技术应用:

$("#btn").on("click",function(event){
		event.preventDefault();
		var $exno=$("input[name=exno]");
		var $exname=$("input[name=exname]");
		
		$.ajax({
			type:"get",
			url:"http://localhost:8080/ajax/checkGrade.jsp",
			data:{
				exno:$exno.val(),
				exname:$exname.val()
			},
			dataType:"jsonp",
			jsonp:"cb",
			success:function(res){
				if(res.code==="1"){
					alert("您的成绩:" + res.grade);
				}else{
					alert("没有查询到您的成绩");
				}
			}
		})
	})

五、总结:

1、JSONP技术的本质是向服务器发送了一个资源请求(并不是XHR请求)。
2、JSONP需要后台和前端进行配合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裴嘉靖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值