佳学网络(建议多翻)

跨域:

浏览器 同源策略  安全机制

没有同源策略限制 的 两大危险场景

1.针对 接口的请求

2.针对 dom的查询

这两方面 的危险

cookie  处理登录场景  让服务端知道谁发出的请求

cookie过程:

如果 请求了接口 进行 登录,服务端  通过后  会在响应头(ResponseHeader) 加入 set-Cookie字段,

下次 再发送请求,浏览器 自动将 cookie  附加在 HTTP请求(Request)的 头字段cookie 中

(setCookie =》ResponseHeader    下次 cookie 携带在http 请求的 头字段 cookie中)

服务端 知道 用户登录过了

危险实例

你懂得 网站 向 买买买网站 发起请求(CSRF攻击: 对方盗用你的身份,以你的名义 发送恶意请求

服务端可以设置httpOnly,使得前端无法操作cookie

有一个 iframe,它的网址 是银行登录页面

通过 window.frames获取到 这个 iframe,然后 iframe.document.getElementById获取 输入密码的 input框

// HTML
<iframe name="yinhang" src="www.yinhang.com"></iframe>
// JS
// 由于没有同源策略的限制,钓鱼网站可以直接拿到别的网站的Dom
const iframe = window.frames['yinhang']
const node = iframe.document.getElementById('你输入账号密码的Input')
console.log(`拿到了这个${node},我还拿不到你刚刚输入的账号密码吗`)

同源策略 不是绝对安全,但它能 提高攻击的成本

同源策略 限制下 接口请求的 正确打开方式

1.jsonP:

在HTML标签里,一些标签比如script、img这样的获取资源的标签是没有跨域限制的

我就知道

// query.cb是前后端约定的方法名字,其实就是后端返回一个直接执行的方法给前端,由于前端是用script标签发起的请求,所以返回了这个方法后相当于立马执行,并且把要返回的数据放在方法的参数里。
    ctx.body = `${query.cb}(${JSON.stringify(successBody({msg: query.msg}, 'success'))})`

前端是 window.jsonpCb = function (res) { console.log(res) }

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <script type='text/javascript'>
      // 后端返回直接执行的方法,相当于执行这个方法,由于后端把返回的数据放在方法的参数里,所以这里能拿到res。
      window.jsonpCb = function (res) {
        console.log(res)
      }
    </script>
    <script src='http://localhost:9871/api/jsonp?msg=helloJsonp&cb=jsonpCb' type='text/javascript'></script>
  </body>
</html>

2.空iframe + form

jsonp 只能发送 get请求

https://segmentfault.com/a/1190000015597029?utm_source=tag-newest

我略微知道的是   先创建一个用来发送数据的iframe   注册iframe的load事件处理程序,如果需要在响应返回时执行一些操作的话

在指定的 iframe中 执行form    把表单添加到主文档中  表单提交后可以删除,不影响下次数据发送

3.CORS( 跨域资源共享  cross-origin resource  sharing)

分为 简单请求  和   非简单请求

简单请求  同时满足两大条件

请求方法是 head、get、post  之一;

http  的头信息 不超出 以下几种字段:accept、accept-language、content-language、content-type:(有三个值,一个是 application/x-www-form-urlencoded)、last-event-id

非简单请求  会发出 一次 预检测请求, 返回码是  204,预检测 通过 才会真正 发出请求,返回 200

4.代理

请求的时候  还是前端的域名  有个东西  帮我们把请求 转发到真正的  后端域名上

nagix配置

server{

listen  xxxx     //监听端口

server_name   localhost       //域名是 localhost

location   ^~  /api{

     proxy_pass      xxxxxx         //服务器端地址

}

}

server{
    # 监听9099端口
    listen 9099;
    # 域名是localhost
    server_name localhost;
    #凡是localhost:9099/api这个样子的,都转发到真正的服务端地址http://localhost:9871 
    location ^~ /api {
        proxy_pass http://localhost:9871;
    }    
}

前端 简单配置后,后端  也只要 写下接口  就可以了吧?

后端接口是一个公共的API,比如一些公共服务获取天气什么的,前端调用的时候总不能让运维去配置一下Nginx,如果兼容性没问题(IE 10或者以上),CROS才是更通用的做法吧。

同源策略下   限制dom查询???

1.window.postMessage() html5的一个接口

2.document.domain

适合 主域名相同  子域名不同的iframe  跨域

document.domain = crossdomain.com  ( 主域名)

----------------------------------------------------------------------------------------------------------------------------------------------------------

this指针:

2个 锦囊:

1,函数 被调用时(即 运行时),才会确定  函数内this 的指向。

函数 中的 this 和 arguments  是两个特殊的  变量,在 函数被调用 才会  取得它们。

2.要确定 函数中this的指向,必须   先找到  该函数被调用的位置。 ??

一.第一种 test()形式

var a = 1
function test () {
    console.log(this.a)
}
test()

this指向  全局对象。

浏览器 是 window,node 中是 global (非严格模式下)

(严格模式下) this  是 undefined

口头说明:

举例说,一个函数,它 内部 

二.xxx.test()

var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
obj.test()

串串烧

var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
var obj0 = {
    a: 3,
    obj 
}
obj0.obj.test()
var a = 1
function test () {
    console.log(this.a)
}
var obj = {
    a: 2,
    test
}
var testCopy = obj.test
testCopy()

jquery   bind 与 on 的区别:

(1) 参数不同  on比bind  多个 selector 参数

$(' xxx ').bind( "事件名", function() {} )

bind 三个参数,分别是  event、data、function

$('xxx').on("事件名", function() {} )

on 四个参数,分别是 event、selector、data、function

这个 selector 什么用呢?

如果是  addEventLister:

var x = docuemnt.getElementByClassName("name")[0];
x.addEventLister("click",function(e) {
    var target = e.target;
    if (target.className === "class1") {
        dosomething();
    }else if (target.className === "class2") {
        doanother();
    } else {
        console.err("ss");
    }
})

如果是 jquery .on:

$('.name').on("click",'.class1', function() {
    dosonmething();
}).on("click",'.class2', function() {
    doanother();
});

(2)bind  不能 绑定用 js生成的 dom节点,因为 dom只 渲染一次(啥意思?),也就是说,bind 不能绑定 动态生成的 dom( 还没有 生成的 dom),呵呵,多来几个说法,自己 体会吧

而 on 可以 绑定 页面渲染时   不存在的 dom

总结:

  1. on可以指定具体的子元素,bind不可以
  2. on可以绑定没有页面渲染时不存在的dom,bind不可以
  3. on是jquery推荐使用的,bind是从某个版本开始就不推荐使用的
  4. on  比 bind 牛B(开玩笑)

引用:https://blog.youkuaiyun.com/YJD19970908/article/details/85224419     

作为一个学渣,学习失败的 经验 最丰富了。

      前辈告诉你,就   多写笔记吧。哪怕 记些  不知所云,也比  丝毫也无   好得多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值