浏览器跨域问题,教你手写实现jsonp跨域

2018-03-21  本文已影响31人  狂澜1991

跨域概述
为什么会有跨域
跨域解决办法:1、jsonp;2、后台代理
手写实现jsonp跨域(包括服务器端代码)

跨域问题

A服务器上的页面去获取B服务器上的资源,由于XMLHttpRequest同源策略限制,A页面是获取不到数据的。

同源:协议、域名、端口号任何一个都要相同,否则就会出现跨域请求。

为什么会跨域

为了安全

解决办法

方法一:jsonp

原理:使用script标签可以跨域请求资源的特性,去发送请求,得到数据

  // localhost:9528 服务器 
  // index.html 
  <body>
    <script>
      function getJsonp(data){
        console.log(data)
      }
    </script>
  <script src='http://lcoalhost:9527/getData?call=getJson'></script>
  </body>
  // localhost:9527 服务器
  // json/getData 接口 (基于express框架)
  router.get("/getData", function (req, res) {
    res.send("getJson({a:1,b:2,c:3})")
  });

这只是一个简单的实现原理说明,现在有成熟的库可以使用 json ,如果有时间,后期将出关于jsonp框架源码分析的文章。

方法二:后台代理

原理:自己搭建一个服务器,提供一个接口,以供前端页面使用,前端页面把url链接发送给后台;然后接到参数后,服务器发送http请求(这儿可以设置各种请求头),接到数据然后返回给页面就行了。

// 前端代码
<img src="http://host/micro-site/change?url=http://mmbiz.qpic.cn/mmbiz_jpg/ZHRvtsJlIIyCKYib6WAzImVbYEN9ljaUNIDtUMpAAAdkib2lVjPeUgI8GaNudwez1CUW9sHVLTrRoxzAoAPMicCgw/640?wx_fmt=jpeg&amp;tp=webp&amp;wxfrom=5&amp;wx_lazy=1">
//  前面 host/micro-site/change 自己服务器的域名和接口
//  url链接是图片的路径 
// 服务器接到url后,发送http请求,根据url请求数据,然后返回给前端页面。
// 后端代码 java
    @GetMapping("change")
    public void image(String url, HttpServletResponse response) {
        response.setHeader("Content-Type", "image/*");
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        httpGet.setHeader("Referer", "");
        httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36");
        try {
            CloseableHttpResponse execute = httpClient.execute(httpGet);
            HttpEntity entity = execute.getEntity();
            entity.writeTo(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
上一篇下一篇

猜你喜欢

热点阅读