跨域与同源策略

##ajax 跨域 http://baidu.com:80/list
不同协议,不同域名,不同端口以及域名和 ip 地址的访问都会产生跨域。

什么情况下发生跨域

  • 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
    当前url被请求的url是否跨域原因
    http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
    http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
    http://www.test.com/http://www.baidu.com/跨域主域名不同(test/baidu)
    http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
    http://www.test.com:8080/http://www.test.com:7001/跨域端口号不同(8080/7001)

跨域的解决方案

###什么是jsonp**

  - jsonp是数据格式json的一种使用模式,可以让网页跨域请求数据,利用的是script元素的开放策略,
    网页可以从其他来源动态产生的JSON数据,而这种使用模式就是所谓的 JSONP。
    - 用jsonp抓到的数据并不是JSON,是任意的JS,使用js语法解析,而无法用JSON解析器解析。
    - JSONP 被称作是一种“让用户利用 script 元素注入的方式绕开同源策略”的方法
##jsonp 实现原理:
      主要是利用动态创建 script 标签请求后端接口地址,然后传递 callback 参数,
      后端接收 callback,后端经过数据处理,返回 callback 函数调用的形式,callback 中的参数就是 json
      (JSONP跨域GET请求是一个常用的解决方案可以利用script标签来向服务器发送请求,服务器端接收到请求后返回一段js代码,
       调用客户端写好的方法,并把JSON数据传入该方法中,客户端即可拿到数据。)

jsonp在哪里使用

  - 在Jquery的api接口中使用,dataType设置为jsonp,
    - 在script标签中通过src调用,需要传递callback回调函数
    - 使用vue-resource插件中 `this.$http.jsonp("url",{}).then(res=>{})` 

jsonp能解决什么问题
- jsonp的数据传输方式是利用了 script标签src属性中的链接可以访问跨域的js脚本 ,
通过src来调用接收服务器返回的js脚本而不是常规的json格式的数据,从而达到接收数据跨域访问的目的。
##优点:
1.浏览器兼容性好,
2.不受同源策略的限制,JSONP可以跨越同源策略;
##缺点:
1.只支持 get 请求方式
2.jsonp在调用失败的时候不会返回各种HTTP状态码。
3.它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。
##代码
3000端口访问8000端口
##3000端口view下index.js中
借用jq

<input type="button" value="请求" id="aa" />
 <script>
        function getdata(msg){
              console.log(msg)                
        }
       </script>
<script src="http://127.0.0.1:8000/api?callback=getdata"> </script>
##8000端口
router.get("/api",function(req,res){    
    var d = req.query.callback  // 接收请求来带的参数 
    var  data  = {"id":1,"title":"hello vue" }
    var data2 =   JSON.stringify(data)    
    var s = d + '(' + data2 + ')';
    res.send(s) 

})

##ajax内的jsonp
3000端口view下list.ejs中

 <input type="button"  value="加载数据"  id="load"  />
    <script>          
           $("#load").click("on",function(){                  
                   $.ajax({
                         url:"http://127.0.0.1:8000/list2",
                         method:"get",
                         dataType:"jsonp",
                         success:function(msg){
                              console.log(msg)
                         }
                   })
           })
    </script>
    route路由下面
        router.get('/list', function(req, res, next) {
        res.render('list');
        });

##8000端口
router.get("/list2",function(req,res){
res.jsonp({id:222,content:“aadasdas”,msg:“success”})
})
##后端解决跨域问题端口
3000

 $("#aa").on("click",function(){           
                $.ajax({
                   url:"http://127.0.0.1:8000/aaa",
                   method:"post",
                   success:function(msg){
                        console.log(msg)
                   }
                     
                })
            })
8000端口 Router下index.js
router.get("/aaa",function(req,res){
    // 后端处理跨域的问题 
    res.header("Access-Control-Allow-Origin", "http://127.0.0.1:3000");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", '3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
    res.json({id:333,title:"cors"})
})
##vue中可使用 vue-resource 中jsonp请求方式
    - vue中使用axios,可以配置跨域,在/config/index.js中
        ```js
            '/api':{
                target: "https://api.happyknowshare.cn/",
                changeOrigin: true,
                pathRewrite: {
                '^/api': ''
                },
            }
    ```

###代理(前端代理和后端通常通过 nginx 实现反向代理) 先把请求发送到自己的服务器 自己的服务器程序去请求那个接口 然后再返给自己的前端
前端代理我在vue 中主要是通过vue 脚手架中的config 中的index 文件来配置的,其中有个 proxyTable 来配置跨域的
前端代理核心实现通过 http-proxy-middleware 插件来实现的,vue2.x 和
vue3.x 脚手架代理跨域实现原理是一样的是 CORS
CORS 全称叫跨域资源共享,主要是后台工程师设置后端代码来达到前端跨域请求的
CORS 的原理:CORS 定义一种跨域访问的机制,可以让 AJAX 实现跨域访问。
CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。
实现此功能非常简单,只需由服务器发送一个响应标头即可。

优点:无需前端工程师设置,只需后端工程师在请求的页面中配置好,并且支持所有请求方式(例如:get,post,put,delete 等)
缺点:浏览器支持有版本要求,如下:
chrome:13+,firefox:3.5+,IE 11+,edge:12+
注:现在主流框架都是用代理和 CORS 跨域实现的

  1. 什么是同源策略

同源策略是浏览器的一种约定,他是浏览器最核心也最基本的安全功能, 同源指的是,
同协议,同域名,同端口,同源策略的目的就是限制不同源的document或者脚本之间的相互访问,以免造成干扰和混乱。

  1. 为什么要有同源策略
  • 如果没有同源策略,浏览器一些正常功能可能都会受到影响,ajax太灵活了,各种请求说法就发
    ,如果没有同源策略的限制,发到哪里都行,只要你构造好参数和请求路径,那人人都是黑客了,这样会导致各种敏感数据的泄露。

  • 那些带src属性的<script><img><iframe><link>等标签是不需要遵守同源策略的,但是通过src加载的资源,
    浏览器限制了javascript的权限,不能进行各种的读写。从而,即使请求发了,敏感数据回来了,

  • 有了同源策略限制,A网站就无法随读取非同源的cookie,localStorage等数据,无法向非同源地址发送ajax请求
    HTTP常见状态码有哪些

    • http状态码我们主要分为2xx,3xx,4xx,5xx常见的几类

      • 200 请求成功
      • 301 请求资源移动到新的url地址
      • 403 客户端请求无权限,服务器拒绝请求
      • 404 没有找到文件
      • 500 服务器内部错误,一般是服务端代码有问题
      • 502 网关错误,服务端返回无效响应
      • 503 服务器性能问题导致,无法处理客户端请求

      2** 请求成功,操作被接受并处理
      3** 重定向
      4** 客户端错误
      5** 服务度错误
      ##请描述一下你对webpack的理解
      Webpack 可以看作是一个模块的打包机,它做的事情就是分析你的项目结构,找到了模块以及其它的一些浏览器不能使用的拓展语言。
      并将其转换和打包为合适的格式提供浏览器使用。

##webpack的四个核心概念是什么
四个核心概念:入口(entry)、输出(output)、loader(预处理文件)、插件(plugins)

##为什么要用webpack
Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,
减少了页面的请求

##分别介绍什么是loader、plugin
loader是文件加载器,能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中
plugin 在webpack运行的生命周期中会广播出许多事件,plugin可以监听这些事件,在合适的时机通过webpack提供的API改变输出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值