前端跨域请求jsonp实现

      跨域问题来历于JavaScript的同源策略,即只有 和谈+本家儿机名+端标语 (如存在)不异,则许可彼此拜候,有一种分歧即不克不及拜候。也就是说JavaScript只能拜候和操作本身域下的资本,不克不及拜候和操作其他域下的资本。跨域问题是针对JS和ajax的,html自己没有跨域问题,好比a标签、script标签、甚至form标签(可以直接跨域发送数据并领受数据)等 。

      JSONP(JSON with Padding)是JSON的一种“利用模式”,可用于解决本家儿流浏览器的跨域数据拜候的问题。因为同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的办事器沟通,而 HTML 的<script> 元素是一个破例。操纵 <script> 元素的这个开放策略,网页可以获得从其他来历动态发生的 JSON 资料,而这种利用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是肆意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

东西/原料

  • 电脑
  • java便捷东西 intellij IDEA或者eclipse
  • 前端编纂东西HBuilder非必需可以利用java编纂东西取代

第一步调:建立一个javaweb项目

  1. 1

    第一种:建立一个springboot的项目。

    1、 打开建立页面 选择File-new-project..

    2、选择建立的项目为spring initializr 进入springboot项目建立步调(也可以选择类型java,建立一个通俗java项目)

    3、输入项目名字,选择依靠web(按照项目需求选择,此次需要),选择存放目次-完当作(Finish)

  2. 2

    第二种:建立一个简单的javaweb项目。

    1、直接打开:https://jingyan.baidu.com/article/ff411625048acf12e482373a.html

    2、或者百度搜刮:servlet类若何映射到url路径 百度经验

第二步调:项目筹办

  1. 1

    第一步:编写被挪用项目标controller。

    1、需要集当作springmvc,springboot项目集当作web就包含springmvc,通俗的servlet需要:

    PrintWriter w = response.getWriter();w.print(json);

    2、端口默认8080

    3、controller代码如下所示

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RestController;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import java.util.Map;

    @RestController

    public class TestController {

    @RequestMapping("/bean")

    public String testJson(HttpServletRequest request,

    HttpServletResponse response, Map paramMap) {

    String callback = request.getParameter("callback");

    String id = request.getParameter("id");

    String name = request.getParameter("name");

    String sex = request.getParameter("sex");

    String json = "{'id':" + id + ",'name':'" + name + "','sex':'" + sex

    + "'}";

    if (callback != null) {

    json = callback + "(" + json + ")";

    }

    return json;

    }

    }

    4、启动办事并测试:

    http://localhost:8080/bean?id=2&name=张三&sex=男

  2. 2

    第二步:挪用项目标筹办。

    1、新建一个javaweb项目

    2、在端标语设置为8020

    3、编写跨域挪用代码,本家儿如果页面js的编写

第二步调:jsonp事项跨域的体例

  1. 1

    第一种:原生的js实现跨域。

    1、借助于原生javascript实现,具体代码如下所示:

    window.onload = function () {

     var script = document.createElement('script');

     script.setAttribute("type","text/javascript");

     script.src = 'http://localhost:8080/bean?callback=ajaxCallback&id=2&name=张三&sex=男';

     document.body.appendChild(script);

    }

     

    function ajaxCallback(data) {

     alert('response data: ' + JSON.stringify(data));

    };

  2. 2

    第二种:借助于jquery的getJSON实现。

    具体代码如下所示:

    <!DOCTYPE html>

    <html>

    <head>

    <meta charset="UTF-8">

    <title>跨域测试</title>

    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

    </head>

    <body>

    <script>

    $.getJSON("http://localhost:8080/bean?callback=?", {id:2,name:'李四',sex:'男'},

        function(data) {

    alert(data.id+data.name+data.sex);

    });

    </script>

    </body>

    </html>

  3. 3

    第三种:借助于jquery的ajax实现。

    <!DOCTYPE html>

    <html>

    <head>

    <meta charset="UTF-8">

    <title>跨域测试</title>

    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

    </head>

    <body>

    <script>

    $.ajax({

            //设置请求类型

            type:"get",

            //请求超不时间

            timeout:5000,

            //设置请求地址

            url: 'http://localhost:8080/bean',

            //设置需要发送的数据

            data: {id:2,name:'李四',sex:'男'},

            //界说此请求为跨域请求

            dataType: 'jsonp',

            //界说回调函数

            jsonpCallback:"callbackUser",

            success: function (data) {

    console.log("当作功");

            },

            error: function (data) {

               console.log(data)

            }

        })

    function callbackUser(data){

    alert("id:"+data.id+" name:"+data.name+" sex:"+data.sex);

    }

    </script>

    </body>

    </html>

  4. 4

    第四种:本家儿如果对三种的优化。

    1、本家儿如果去除jsonpCallback属性,url中传callback=?界说默认挪用ajax的回调函数。要与后台代码对应(String callback = request.getParameter("callback");)

    2、挪用项目页面如下所示:

    <!DOCTYPE html>

    <html>

    <head>

    <meta charset="UTF-8">

    <title>跨域测试</title>

    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

    </head>

    <body>

    <script>

    $.ajax({

            //设置请求类型

            type:"get",

            //请求超不时间

            timeout:5000,

            //设置请求地址

            url: 'http://localhost:8080/bean?callback=?',

            //设置需要发送的数据

            data: {id:2,name:'李四',sex:'男'},

            //界说此请求为跨域请求

            dataType: 'jsonp',

            success: function (data) {

    console.log("当作功");

    alert("id:"+data.id+" name:"+data.name+" sex:"+data.sex);

            },

            error: function (data) {

               console.log(data)

            }

        })

    </script>

    </body>

    </html>

第四步调:总结

  1. 1

    1、jsonp实现的体例就是借助于script标签的src属性获取数据,然后将数据作为参数传给函数,解析数据。这一点我们需要连系后台callback +  "(" + json + ")"

    可以看出一二。

    2、跨域问题的解决方案除了jsonp体例外还有一种CORS,与jsonp分歧的是这是一种后台解决方案。

注重事项

  • jdk 1.8
  • 发表于 2019-05-08 20:01
  • 阅读 ( 816 )
  • 分类:其他类型

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
admin
admin

0 篇文章

作家榜 »

  1. xiaonan123 189 文章
  2. 汤依妹儿 97 文章
  3. luogf229 46 文章
  4. jy02406749 45 文章
  5. 小凡 34 文章
  6. Daisy萌 32 文章
  7. 我的QQ3117863681 24 文章
  8. 华志健 23 文章

推荐文章

联系我们:uytrv@hotmail.com 问答工具