jsonp实现JavaScript跨域请求
2017-03-17 14:48
162 查看
跨域方法有很多种,今天就来看一下,jsonp是如何实现跨域请求的。
一. 什么是跨域,以及为什么要跨域
(1)所谓跨域请求,就是跨不同的域来发送请求,不同的域就是在协议、域名、端口号中,有一个不同,就是不同的域,比如:http://localhost:8080和http://localhost:8888就是不同的域,因为端口号不同。
(2)如果我们在做一个比较大的项目,不同的资源部署在不同的服务器上,这时就需要跨域请求,然而为了保护信息的安全,浏览器并不支持跨域请求,这是浏览器默认的安全策略,即同源策略(同源指协议、域名、端口号完全相同)。因此一些跨域方法就应运而生。
二. jsonp跨域请求原理
我们平时在写HTML代码时,可以发现,
过程如下:
首先创建
然后服务器端响应请求,将数据以函数名加参数的形式返回;
返回成功浏览器就直接执行要执行的js函数,删除刚才创建的
三. 自己写的小例子
HTML代码:
在代码中一旦点击按钮,就立即创建
服务器端代码:
成功后再浏览器控制台输出:
这是一个很简单的小例子,只是返回了字符串,要返回json格式的在后台封装就好,还有一点要提醒下,jsonp只能是get请求,不能是post请求,看到很多帖子,把它和ajax做比较,个人觉得它和ajax是两个不同的东西,ajax是通过XMLHttpRequest对象来实现请求响应的,两者不是一个原理。这是关于jsonp的内容,请多指教。
一. 什么是跨域,以及为什么要跨域
(1)所谓跨域请求,就是跨不同的域来发送请求,不同的域就是在协议、域名、端口号中,有一个不同,就是不同的域,比如:http://localhost:8080和http://localhost:8888就是不同的域,因为端口号不同。
(2)如果我们在做一个比较大的项目,不同的资源部署在不同的服务器上,这时就需要跨域请求,然而为了保护信息的安全,浏览器并不支持跨域请求,这是浏览器默认的安全策略,即同源策略(同源指协议、域名、端口号完全相同)。因此一些跨域方法就应运而生。
二. jsonp跨域请求原理
我们平时在写HTML代码时,可以发现,
<img>标签,<script>标签,以及CSS的<link>标签,里面的引用资源,都是可以跨域的,当代码运行到标签时就直接加载所引用的资源。jsonp就是利用
<script>标签的具有可跨域的特性来实现跨域请求的。
过程如下:
首先创建
<script>标签,在src中声明要发送请求的路径,将要执行的函数以键值对的形式用问号链接附在路径的后面;
然后服务器端响应请求,将数据以函数名加参数的形式返回;
返回成功浏览器就直接执行要执行的js函数,删除刚才创建的
<script>标签。
三. 自己写的小例子
HTML代码:
<!DOCTYPE html> <html> <head> <title>jsonp练习</title> </head> <body> <button id="btn">点我</button> <script> //请求成功要执行的函数 function func(data){ console.log(data); } document.getElementById("btn").addEventListener("click", function(){ var scriptTag = document.createElement("script"); //链接后面表达式为要传递给服务器端的函数名,函数名为要执行的函数 scriptTag.src = "http://localhost:8080/user?callback=func"; document.getElementsByTagName("body")[0].appendChild(scriptTag); document.getElementsByTagName("body")[0].removeChild(scriptTag); }, true); </script> </body> </html>
在代码中一旦点击按钮,就立即创建
<script>标签,然后给src属性附上请求路径,在将标签加到body中,请求就立即响应,一旦响应成功,就删除标签。
服务器端代码:
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.Writer; /** * Created by jing on 2017/3/16. */ public class UserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String funcname = request.getParameter("callback"); //接收函数名参数 Writer out = response.getWriter(); //返回数据为函数名加参数,以字符串形式返回,即:func("nihao"); String data = funcname + "('"+ "nihao" + "')"; out.write(data); System.out.println(data); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
成功后再浏览器控制台输出:
这是一个很简单的小例子,只是返回了字符串,要返回json格式的在后台封装就好,还有一点要提醒下,jsonp只能是get请求,不能是post请求,看到很多帖子,把它和ajax做比较,个人觉得它和ajax是两个不同的东西,ajax是通过XMLHttpRequest对象来实现请求响应的,两者不是一个原理。这是关于jsonp的内容,请多指教。
相关文章推荐
- JQuery利用JSONP实现跨域请求
- 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
- PHP AJAX JSONP实现跨域请求使用实例
- Ajax+Spring MVC实现跨域请求(JSONP)
- 关于JQuery 中$.ajax函数利用jsonp实现Ajax跨域请求ASP.NET的WebService成功获取数据的案例
- jsonp突破同源策略,实现跨域访问请求
- 通过JSONP实现ajax跨域请求java接口实现
- javascript实现jsonp跨域问题+原理
- PHP AJAX JSONP实现跨域请求使用实例
- JSON和JSONP有哪些区别,PhoneGap跨域请求如何实现
- 使用Jsonp实现跨域请求
- PHP AJAX JSONP实现跨域请求使用实例
- springMVC实现jsonp的跨域请求
- Jsonp实现跨域请求数据
- JSON和JSONP有哪些区别,PhoneGap跨域请求如何实现
- 跨域请求的三种实现 jsonp,cors,IFame
- JavaScript中的jsonp(跨域请求)
- 通过jsonp获取json数据实现AJAX跨域请求
- Ajax+Spring MVC实现跨域请求(JSONP)
- 基于JSONP的跨域请求实现