精华内容
下载资源
问答
  • 小号模式本质又是什么呢?下面便来给大家详细讲讲。HTTP在访问网站时可以看到,网页的地址都是以HTTP或HTTPS开头。这个HTTP为我们多姿多彩的互联网网页世界打好了基础。HTTP/HTTPS后面便是网站的域名和网页地址,...

    在使用浏览器的时,同一个网站尝试登入两个不同帐号时就会发现帐号相互影响,无法正常使用,无法如愿以偿。而使用浏览器的小号模式则不会出现这个问题。那么,为什么会出现串号呢?小号模式本质又是什么呢?下面便来给大家详细讲讲。

    HTTP

    148e4ea26d710e90a955cd419681fb44.png

    在访问网站时可以看到,网页的地址都是以HTTP或HTTPS开头。这个HTTP为我们多姿多彩的互联网网页世界打好了基础。HTTP/HTTPS后面便是网站的域名和网页地址,犹如家庭地址的门牌号。告诉服务器你希望访问哪个页面。

    我们都知道,登录不同的账号,浏览器显示的内容是不同的。然而前面说的这些只能告诉服务器你想访问哪个页面,服务器并不能知道你是谁。在服务器得到的信息中,除了IP地址,其他大部分信息都可以进行篡改。为了让服务器知道你是谁,就需要引入Cookie/Session。

    Cookie/Session

    2b396b792ee517d8b16d899bf4c69ce1.png

    这里说的Cookie当然不是曲奇饼干(笑)

    服务器在认可了你的身份后(例如帐号密码登录后),会给你发送Cookie/Session,以后每次访问这个网站,都会将服务器发送给你的Cookie/Session再重新发送给服务器,服务器便知道了你是谁,也就可以根据不同的账号显示不同的页面内容。

    当你点击退出账号时,网站会告诉浏览器,Cookie/Session已经没用了,可以删除了,同时服务器也不再认可之前发送的Cookie,这样你的账号也就退出了。

    Cookie通常都是有时间限制的,短则页面全部关闭就失效,长则几天乃至几个月。这也就是自动登录的实现原理。Session通常在浏览器关闭时就失效,这也是非自动登录最早的实现思路。

    如果你同时打开两个网页,一边登陆了帐号,刷新一下另一个页面也就“自动”登录了帐号。因为同一个网站的不同页面发送的Cookie是相同的。同理,一个页面退出账号,登录小号,另一个页面也就被认为登录了小号,只不过需要刷新才能看到变化。这也就形成了我们所说的“ 串号 ”。

    若我确实需要登录两个账号分别操作怎么办呢?别急,可以使用无痕模式,也有浏览器称为隐私模式,小号模式。

    小号模式/无痕模式

    最早这种模式是为了保护隐私,无痕模式的所有内容独立存放,关闭浏览器后全部删除。使用非IE浏览器基本都能找到这项功能。

    这里的所有内容,当然也包含了Cookie。 两套Cookie互不影响,这样也就实现了登录两个账号不串号。

    在最早的网站中,这个功能看起来是相当鸡肋。后发现可以巧妙的使用无痕模式实现多账号登录,这个功能也算得以保留下来。国内的浏览器厂商甚至直接将其改名为小号模式。

    安全提示

    从上文的描述中不难发现,Cookie十分重要。聪明如你应该已经发现了,没有账号密码,截获了你的Cookie依然可以登录你的账号。对,没错,是这样的。

    当怀疑有人截获了你的Cookie后,你能做的也就是以忘记密码的方式修改密码,大多数网站都会重置你的Cookie,让你重新获得账号的控制权。

    在早年间,他人搭建的百度贴吧自动签到系统一度十分火爆。而实现自动签到当然便是采用我们上文提到的发送Cookie确认身份的方式为你的账号自动签到。显而易见,这种方式风险极大。

    网站通过各种各样的教程教会了用户如何提取自己的关键Cookie,并提交到网站,其与直接将账号密码交与他人差别不大,而大多数人则并没有意识到这个风险。

    Token令牌

    结尾再说说Token令牌。

    当使用QQ点击邮箱图标进入QQ邮箱时,网站又是如何确定身份信息的呢?这里便采用了Token。

    当点击邮箱时,弹出的网页快速按esc取消时,可以发现当前所访问的网页地址非常长,例如:

    https://ssl.ptlogin2.qq.com/qqmail?pt_clientver=5611&pt_src=1&ptlang=2052&Fun=clientread&uin=**********&k=*********************************&httptype=1&biz=0&ADUIN=**********&ADSESSION=*********

    网站通过地址中的这些敏感信息,识别用户身份,再返回Cookie/Session,保持用户的登录状态。

    这一段信息也可以看做是另类的账号密码了。有些不法分子便会通过用户不了解其作用,放下警惕,将“账号密码”泄露出来。

    并不是紧握账号密码便能保护账号安全。在陌生人面前,这些不懂的操作万不可随意操作,交出了帐号控制权自己却丝毫不知。

    展开全文
  • 区块时代、链接未来,大家好,今天带大家来了解MGC Token,在基于区块链数字经济时代与创新商业模式的全新载体,MGC TOKEN以独特的技术创新打造一个去中心化多功能数字资产钱包,同时MGC TOKEN一个去中心化的...

    区块时代、链接未来,大家好,今天带大家来了解MGC Token,在基于区块链数字经济时代与创新商业模式的全新载体,MGC TOKEN以独特的技术创新打造一个去中心化多功能数字资产钱包,同时MGC TOKEN也是一个去中心化的支付应用,致力于线上线下实现以MGC代币为通证,打造跨国际多领域实现应用的多功能数字资产钱包。MGC Token由英国伦敦金融中心BG-FM团队所开发,国际先进技术优势,支持多种加密代币存储,例如:BTC/ETH/XRP等等以及其他底层技术的数字资产存储,MGC Token以全球综合性交易存储系统 ,为数字资产提供安全的存储环境、多币种管理服务以及稳健的ATS数字资产理财收益,将会以MGC代币作为推广奖励。MGC TOKEN拥有强大的区块链技术研发团队,有来自全球最顶尖的四位区块链领域的专家人才,MGC TOKEN 在将要在英国伦敦发行的代币被称为(MGCCoin,以下简称‘MGC’、‘代币’)。发行后不但在MGC TOKEN自身系统内运行,而且在将在全球主要加密货币交易所上线并自由买卖,同时打造线下落地生态支付首选。MGC Token是应用区块链技术打造的,具有提高支付系统安全性、防篡改等优点,首先,在交易过程中,消费者所提交的交易记录可以通过支付系统的核实验证。系统根据区块链的智能化合约达成交易并自动生成支付指令。同时所属区块中心会将各环节的数据逐一记录下来,通过区块记录下的交易数据,交易值程同步更新MGC TOKEN对于用户资产安全性和防盗性,MGC Token钱包里的资金是隔离的,分为用户钱包,ATS量化钱包,MGC佣金钱包,是隔离管理,并且用户存储的数字资产是写进区块里的,除私钥持有者任何人不可持有或进行交易,人为风险控制以及自动化风险管理,最大程度控制投资风险。MGC Token是一个可以兼容多币种去中心化的钱包,采用SHA512-ZERO 加密技术,以及独立私钥+动态验证码的方案,保证对MGC Token网络的数据安全。从MGC Token研发成功以来,经历了上百次抗压防盗测试,最大化保障用户的资金安全,为用户提供安全放心的存储空间。MGC Token除了提供用户数字资产存储以外还创新了智能理财系统,那就是Automated trade system智能搬砖系统,ATS智能机器人可以自动识别捕捉各个交易所存在的交易总量以及差价,系统自动发出执行指令进行高频率量化交易,并且在合适的时间买进卖出获得收益,还可以捕捉各个平台币币交易的差价获得数量增长,在ATS智能理财系统操作过程当中完全不受价格涨跌的影响,解决传统人工套利的各种弊端和风险,所有用户可以将MGC Token所支持的代币委托给ATS智能系统去进行搬砖套利获取收益,所得收益会以MGC分配至个人钱包账户,用户可以随时查询ATS智能系统套利详情,套利过程公开透明,凡是开启智能机器人的用户都能实时观看最新动态,当然用户可以随时选择暂停ATS智能理财系统,所委托的数字资产和智能收益会转至您的钱包账户,用户除了智能理财系统还可以获得市场推广佣金,您可以获得直接推广用户智能收益的100%,举例该用户存入10个以太坊,按照他这个月智能收益10%计算,您将获得1个以太坊价值的MGC代币,如果你推荐了10个用户他们每人存入10个以太坊那么您每月将获得10个以太坊价值MGC代币作为奖励,一次选择终身收益,第二层至第十层你依然可以拿他们只能收益的10%,这还没有结束,您还可以获得第十一层至第二十层他们的智能收益的1%是不是很给力呢!只有在这个区块链数字经济时代才可以实现,还在等什么呢,抓紧开启ATS智能理财系统吧。当然MGC Token远远不止这些功能,为用户带来每日稳健的收益,此外MGC Token将会实施落地生态的战略规划,以及MGC通证的流通,MGC Token已经开始了行动,我们使用区块链开创性地与支付领域结合在一起,并且融入了 MGC 代币的优势。MGC Token在为买家提供线上交易应有的消费保护,并且平台汇聚流量,为千万商家提供消费群体,MGC Token成为中介平台,我们希望进一步优化加密货币的优点,如快捷的交易,低成本及低跨境交易阻力,允许商家与来自全球各地日益壮大的加密货币持有者进行交易。我们的目标是为市场打造一款综合的支付应用程序接口并有能力成为加密支付行业里的领头者,以上所述将使MGC Token成为未来的趋势,MGC TOKEN 将成为一个多功能数字资产综合性服务平台。

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 那么,当你听懂了《一生所爱》,你就真的懂了什么是哀伤和无奈。 《大话西游》不可超越的经典,在《月光宝盒》中,至尊宝为了救白晶晶,使用月光宝盒使时光倒流,几次后产生故障,竟将其带回五...
        
    备忘录模式 Memento
    image_5c19dcbd_5407
     
    沿着脚印,走过你来时的路,回到原点。
     
     
    苦海翻起爱恨
     
    在世间难逃避命运
     
    相亲竟不可接近
     
    或我应该相信是缘份
     
    一首《一生所爱》触动了多少人的心弦,一段五百年都没有结果的爱情,让多少人潸然泪下。
    有人说:当你真正看懂了《大话西游》,你就真的懂了爱情;那么,当你听懂了《一生所爱》,你就真的懂了什么是哀伤和无奈。
    《大话西游》是不可超越的经典,在《月光宝盒》中,至尊宝为了救白晶晶,使用月光宝盒使时光倒流,几次后产生故障,竟将其带回五百年前,这时紫霞仙子(朱茵饰)向她走来......
     
    百度百科中关于词条“VMware快照”的描述
    磁盘“快照”是虚拟机磁盘文件(VMDK)在某个点即时的复本。
    系统崩溃或系统异常,你可以通过使用恢复到快照来保持磁盘文件系统和系统存储
    当升级应用和服务器及给它们打补丁的时候,快照是救世主。VMware快照是VMware Workstation里的一个特色功能。
     
    image_5c19dcbd_6204
     

     
    “脚印”记录了我们来时的路,所以我们可以原路返回;
    “月光宝盒”记录了时间的状态,所以至尊宝可以时光穿梭;
    “VMware快照”记录了虚拟机磁盘文件(VMDK)在某个点的状态,所以可以通过快照进行系统恢复;
    以上,他们都记录了状态,进而可以恢复到原来的状态

    意图

    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
    这样以后就可以将该对象恢复到原先保存的状态。
    别名:快照模式或者token标记模式
     
    在程序开发过程中,有时可能需要记录对象的状态,以便允许用户取消不确定的操作或者从错误恢复过来
    对象的某个瞬时状态,叫做快照(如同你去拍证件照,立等可取,快速的拍照,俗称快照)
    每一个快照,通常叫做一个检查点
    想要实现快照和撤销恢复机制,就必须将对象的状态保存起来。
    这就是备忘录模式的初衷
     
    面向对象的三大特征之一就是封装,对象往往封装了他的状态信息,使之与外部的对象隔离
    这部分信息通常都是私有的private,不能被外部对象访问,也就是说不能在外部进行保存
    如果暴露内部属性比如设置为public,可以外部保存,但是这又违反了封装的原则。
    换句话说,封装起来,外部就不能直接访问,但是我们又需要将他的状态保存在外部
    而且还不想破坏封装性,也不想暴露内部属性。
     
    也就是如何将对象的状态保存在外部,但是外部却仍旧不知道对象的属性细节
     
    这个问题类似于:你想把你的一堆私人物品找个地方保存,但是你又不想别人看到你里面的东西怎么办?
    最简单的方式就是借助于行李箱
    大家都坐过火车,在车站都有箱包寄存处
    我们把所有的物品锁到行李箱中,行李箱寄存起来,管理员负责管理我们的行李箱,他并不知道我们箱子里面装的到底是什么
    当我们回来取箱子时,管理员将箱子交还给我们,他自始至终都不知道箱子里是什么
     
    在程序中,我们应该如何解决这个问题呢?也就是又能外部保存,又不破坏封装?
    备忘录模式就是解决这种场景问题的,通过引入备忘录角色Memento和控制外界对他的访问来解决。

    结构

    image_5c19dcbe_478c
    原发器角色Originator
    也叫做发起者,原发器是需要被保存状态的角色,也就是我们的业务逻辑对象
    他创建备忘录Memento对象,也就是创建快照,并且负责借助于备忘录对象Memento恢复状态
     
    备忘录角色Memento
    负责记录Originator的部分或者全部状态,也就是拥有Originator的部分或者全部属性
    备忘录角色的设计必然要参考Originator
     
    备忘录角色应该仅仅允许Originator对其进行修改访问,其他包括CareTaker只能够对备忘录进行传递
    备忘录角色就是前文的“行李箱”
     
    管理员角色CareTaker
    负责管理保存备忘录
     
    上面说到备忘录模式的解决问题思路“引入备忘录角色Memento和控制外界对他的访问来解决
    具体为:
    • 备忘录模式通过引入备忘录Memento记录对象的内部状态
    • 引入管理员CareTaker对备忘录进行管理
    • 控制访问--原发器Originator与备忘录对象进行交互,其他所有地方都只是获取传递,不更改设置Memento的状态 
    也就是通过备忘录对象对原始对象需要保存的内部状态进行封装
    而且,控制对他的访问,外人不能访问内部
    这样借助于备忘录对象这个中间层就实现了“在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态
     
    对于备忘录对象访问的控制是必须的,如果外界可以随意访问变更备忘录对象
    某种程度上来说相当于可以更改原始对象的私有属性了
    这是不安全的
     
    备忘录模式将“内部状态”与“外界保存”进行解耦,通过中间层备忘录对象来连接。

    代码示例

    一个简单的快照实现

    有一个业务逻辑类Originator,快照主要是对他的状态,也就是内部state属性,进行备份
    快照信息保存在备忘录Memento中
    通过管理员CareTaker进行保管
    package memento.simple;
    /**
    * 业务逻辑类,也就是我们需要备份的对象
    * 内部拥有state属性,用来表示快照需要保存的状态数据
    */
    public class Originator {
        private Integer state;
        /**
        * 创建快照备份
        * @return
        */
        public Memento createMemento() {
            return new Memento(state);
        }
        /**
        * 恢复快照
        * @param memento
        */
        public void recovery(Memento memento) {
            state = memento.getState();
        }
         
        public Integer getState() {
            return state;
        }
         
        public void setState(Integer state) {
            this.state = state;
        }
         
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Originator{");
            sb.append("state=").append(state);
            sb.append('}');
            return sb.toString();
        }
    }

     

    package memento.simple;
    /**
    * 备忘录类用来保存业务逻辑对象的状态(原发器)
    * 备忘录类的属性要参考原发器的设计,确定需要保存哪些数据信息
    * 此处我们以state为演示
    * 备忘录类提供了getter和setter方法
    */
    public class Memento {
        private Integer state;
        Memento(Integer state) {
            this.state = state;
        }
         
        public Integer getState() {
            return state;
        }
         
        public void setState(Integer state) {
            this.state = state;
        }
    }

     

    package memento.simple;
    /**
    * 管理员类,内部拥有一个memento,可以设置和获取这个属性
    */
    public class CareTaker {
     
        private Memento memento;
        public Memento getMemento() {
            return memento;
        }
         
        public void setMemento(Memento memento) {
            this.memento = memento;
        }
    }

     

    package memento.simple;
    public class Test {
     
    public static void main(String[] args) {
     
        //创建业务逻辑对象,设置状态信息
        Originator originator = new Originator();
        originator.setState(2);
         
        //快照
        Memento memento = originator.createMemento();
        CareTaker careTaker = new CareTaker();
        careTaker.setMemento(memento);
         
        System.out.println("初始时状态: " + originator.toString());
         
        originator.setState(3);
        System.out.println("更新状态后: " + originator.toString());
         
        originator.setState(8);
        System.out.println("更新状态后: " + originator.toString());
         
        originator.setState(6);
        System.out.println("更新状态后: " + originator.toString());
         
        originator.recovery(careTaker.getMemento());
        System.out.println("恢复状态后: " + originator.toString());
        }
    }

     

     
    image_5c19dcbe_7c07
     
    上面的示例中,备忘录Memento对象封装保存原发器角色Originator的状态,管理员CareTaker对备忘录进行管理 
    Memento内部的属性state,尽管我们设置了公有的访问器 getter和setter,但是CareTaker以及外界并没有对Memento进行访问
    我们是借助于代码逻辑实现了:
    • Memento备忘录对来自Originator的修改开放(比如上面的Originator可以创建Memento)
    • Memento备忘录对来自CareTaker的修改开放(上面示例中,仅仅传递Memento,不曾访问内部细节)
    这种模式又被称为白盒模式,因为Memento备忘录大家都看得到,而且都能够对她进行设置处理
    我们是借助于“大家写代码的时候都不要访问修改Memento备忘录对象的属性”这一要求完成的
    可能一不留神,某个人的代码中就修改了Memento备忘录对象。
    说白了,这种对原发器开放,对外界关闭的限制不是强制的,容易出问题
     
    怎么才能够强制将备忘录类仅仅对原发器开放,对外界关闭?
    我们可以定义两个接口,Open Close用于描述开放和关闭(close接口意为对外界封闭的接口)
    所有的对Memento的操作方法,全部定义在Open中,Close不定义任何方法,也就是标记接口
    给原发器Originator使用接口Open,外部所有的地方使用Close类型
    这样所有使用Close的地方,都不能够修改Memento对象
    image_5c19dcbe_67cc
    这样在原来的基础上,将限制增强了,只要是Close类型,那么就不能修改Originator了
    不过显然,Open接口也不是私有的,外界仍旧可以使用,所以只是比原来稍微强化一点
    并不能彻底解决

    内部类方式重构

    在java中,可以借助内部类的形式
    因为内部类与外部类是友好的
    另外与Close接口结合使用,实现对外界的关闭
     
    标记接口,外界看到的始终是标记接口,无方法可用
    package memento;
    public interface MementoInterface {
    }
    原发器,将Memento放置在内部,对外界仅仅返回标记接口
    只有内部才拥有真正的Memento类型
    package memento;
    /**
    * 业务逻辑类,也就是我们需要备份的对象 内部拥有state属性,用来表示快照需要保存的状态数据
    */
    public class Originator {
        private Integer state;
        /**
        * 创建快照备份返回标记接口,以使外界不能操作备忘录
        */
        public Memento createMemento() {
            return new Memento(state);
        }
        /**
        * 恢复快照,接受MementoInterface类型参数 使用时强转为内部类Memento
        */
        public void recovery(MementoInterface memento) {
            state = ((Memento) memento).getState();
        }
        public Integer getState() {
            return state;
        }
        public void setState(Integer state) {
            this.state = state;
        }
        /**
        * 私有内部类,实现MementoInterface接口,标记接口 用以外界交互,达到对外界close的效果
        */
        private class Memento implements MementoInterface {
                private Integer state;
             
            Memento(Integer state) {
                this.state = state;
            }
             
            public Integer getState() {
                return state;
            }
             
            public void setState(Integer state) {
                this.state = state;
            }
        }
        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder("Originator{");
            sb.append("state=").append(state);
            sb.append('}');
            return sb.toString();
        }
    }

     

    外界仅仅接触到MementoInterface类型
    CareTaker维护memento
    package memento;
    /**
    * 管理员类,内部拥有一个 MementoInterface,可以设置和获取这个属性
    */
    public class CareTaker {
        private MementoInterface memento;
        public MementoInterface getMemento() {
            return memento;
        }
        public void setMemento(MementoInterface memento) {
            this.memento = memento;
        }
    }
    image_5c19dcbe_1f8c
    重构后的打印结果如上图所示与原来一致,但是外界却不能修改备忘录对象,备忘录仅仅对原发器开放
     
    image_5c19dcbe_310
    上图为重构后的结构
    Memento作为Originator的内部类,有外部类的引用
    隐藏了Open接口,或者说Memento自身也代表了Open接口角色,提供方法可以给外部类Originator使用
    CareTaker通过MementoInterface交互,无法访问Memento内部属性
    客户端访问Originator和CareTaker,借助于CareTaker管理CareTaker创建的快照

    时序图

    image_5c19dcbe_465
    时序图上半部分(1,2,3)为快照保存,下半部分(4,5)为快照恢复
    步骤解析:
    1. 客户端程序对原发器Originator进行状态设置
    2. 客户端程序对原发器进行快照创建
    3. 客户端程序对快照进行保存
    4. 客户端程序获得快照
    5. 客户端程序根据快照进行状态恢复

    重构小结

    重构的逻辑为:
    • 借助于私有内部类实现了对外界的封闭
    • 将负责人管理员CareTaker与Memento进行解耦,通过抽象MementoInterface进行连接
    也就是使用MementoInterface作为外界与Memento访问的中间层
     
    更加合理的实现了“在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态”
     
    多版本快照
    上面的示例中,CareTaker仅仅定义了一个内部属性  private MementoInterface memento;
    也就是只能保存一种状态,实际情况下显然不会如此简单,所以可以借助于集合框架对快照进行管理
    比如使用HashMap(String,MementoInterface)进行快照版本控制,key可以为版本号

    形式变换

    CareTaker管理功能的增强
    在上面重构后的示例中,客户端对Originator进行操作,并且负责快照的创建以及保存
    以及恢复快照时的快照读取
    也就是说客户端程序自身协调Originator与CareTaker,CareTaker仅仅负责快照的保存
    可以考虑将客户端程序的功能封装到CareTaker中
    其余部分不变,仅仅调整CareTaker
    内部新增了属性Originator,通过构造方法注入
    新增了创建快照和恢复的方法,底层依赖Originator  这就实现了客户端功能的封装
    package memento.refactor1;
    /**
    * 管理员类,内部拥有一个 MementoInterface,可以设置和获取这个属性
    */
    public class CareTaker {
     
        private MementoInterface memento;
        private Originator originator;
         
        CareTaker(Originator originator) {
        this.originator = originator;
        }
         
        /**
        * 创建快照,借助于内部的Originator
        */
        public MementoInterface createMemento() {
            return originator.createMemento();
        }
         
        /**
        * 恢复快照,借助于内部的Originator
        */
        public void recovery(MementoInterface memento) {
            originator.recovery(memento);
        }
        public MementoInterface getMemento() {
            return memento;
        }
        public void setMemento(MementoInterface memento) {
            this.memento = memento;
        }
    }
    变种形式实现了CareTaker对Originator的完全管理,而不仅仅是保存快照
    简化的CareTaker
    careTaker用于保存快照
    或者可以变形为大保姆,不仅仅保存快照,也用于Originator快照的创建与恢复
    有些场景下,也可以省略CareTaker
    在我们上面的示例测试主函数中,一边创建了快照,很快下面就用到了快照进行恢复
    这种场景,显然没有必要专门的安排管理员,可以省略CareTaker角色
    伪代码:
    public static void main(String[] args) {
    Memento memento = originator.createMemento();
    originator.recovery(originator.recovery();
    }
    Originator与Memento合并
    备忘录模式的根本在于状态的保存,模式的结构是一种通用的解决方案
    Memento对象是对于Originator内部部分或者全部状态的一个封装
    如果只是保存对象的状态,也可以借助于原型模式进行替代
    也就是说使用另外一个新的Originator对象保存当前Originator对象的状态,这与白盒方式的备忘录模式效果一样

    与命令模式的联系

    命令模式中将“方法调用”这种命令行为或者说请求 进一步的抽象
    封装为一个命令对象,从而可以达到对请求记录的功能,进而可以实现撤销操作。
    备忘录模式也是为了记录对象的内部状态,为实现撤销操作做基础工作。
     
    命令模式侧重于请求历史的日志记录,能够记录操作的轨迹,然后调用命令接收者的撤销方法
    而撤销方法基本上需要对象的内部状态
    备忘录模式则是记录对象的状态变化
    一个是宏观一个是微观
     
    所以说,备忘录模式与命令模式不是可替代关系,而是可以相互配合的好基友
    命令模式记录操作历史,备忘录模式记录对象的状态,一起配合实现撤销的操作。

    总结

    备忘录模式,模式如其名,就是记录状态信息。
    备忘录模式引入备忘录角色将对象的“内部状态”与“外部保存”进行解耦
    通过对备忘录角色的访问限制,达到备忘录对原发器Originator开放,对外界关闭的效果
     
    备忘录模式的重点在于对于Memento的访问控制---对Originator开放,对外界关闭
    也就是通常所谓的双接口支持,就是双重标准嘛
    也是一种设计思维为了系统安全,提供一个标记接口给外部访问。能够保障系统的安全。
     
    通过对状态的记录,提供了状态恢复的实现机制。
    每个备忘录对象都是Originator对象的一个瞬时状态,通过对状态变化轨迹的记录,可以实现多次状态轨迹的还原
    而且,复杂场景,还可以与命令模式结合使用。
     
    缺点也是明显的,对于Originator对象的每一个瞬时状态都使用Memento对象进行保存
    如果Originator对象本身很占用资源,那么势必导致占用过多的内存空间,这都是一个个的对象
     
    当你需要保存一个对象的瞬时的部分或者全部状态时,可以考虑使用备忘录模式
     
    展开全文
  • 知乎:https://zhuanlan.zhihu.com/p/52300092HTTP 一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权非常重要...
    知乎:https://zhuanlan.zhihu.com/p/52300092
    ca15b474aed588ea748b2f499f637860.png

    HTTP 是一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求是谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权是非常重要的一环,实践中有多种可用方案,并且各有千秋。

    基于 Session 的会话管理

    在 Web 应用发展的初期,大部分采用基于 Session 的会话管理方式,逻辑如下。

    • 客户端使用用户名密码进行认证服务端生成并存储 Session,将 SessionID 通过 Cookie 返回给客户端客户端访问需要认证的接口时在 Cookie 中携带 SessionID服务端通过 SessionID 查找 Session 并进行鉴权,返回给客户端需要的数据
    adb07351473548378dfbcdd18b68c62b.png

    基于 Session 的方式存在多种问题。

    • 服务端需要存储 Session,并且由于 Session 需要经常快速查找,通常存储在内存或内存数据库中,同时在线用户较多时需要占用大量的服务器资源。当需要扩展时,创建 Session 的服务器可能不是验证 Session 的服务器,所以还需要将所有 Session 单独存储并共享。由于客户端使用 Cookie 存储 SessionID,在跨域场景下需要进行兼容性处理,同时这种方式也难以防范 CSRF 攻击。

    基于 Token 的会话管理

    鉴于基于 Session 的会话管理方式存在上述多个缺点,无状态的基于 Token 的会话管理方式诞生了,所谓无状态,就是服务端不再存储信息,甚至是不再存储 Session,逻辑如下。

    • 客户端使用用户名密码进行认证服务端验证用户名密码,通过后生成 Token 返回给客户端客户端保存 Token,访问需要认证的接口时在 URL 参数或 HTTP Header 中加入 Token服务端通过解码 Token 进行鉴权,返回给客户端需要的数据
    18220c0062aa277a3fc9c43ccf623cf9.png

    基于 Token 的会话管理方式有效解决了基于 Session 的会话管理方式带来的问题。

    • 服务端不需要存储和用户鉴权有关的信息,鉴权信息会被加密到 Token 中,服务端只需要读取 Token 中包含的鉴权信息即可避免了共享 Session 导致的不易扩展问题不需要依赖 Cookie,有效避免 Cookie 带来的 CSRF 攻击问题使用 CORS 可以快速解决跨域问题

    JWT 介绍

    JWT 是 JSON Web Token 的缩写,JWT 本身没有定义任何技术实现,它只是定义了一种基于 Token 的会话管理的规则,涵盖 Token 需要包含的标准内容和 Token 的生成过程。

    一个 JWT Token 长这样。

    466e85ec0b955cfe95dc6d7ffe771918.png

    仔细辨别会发现它由 A.B.C 三部分组成,这三部分依次是头部(Header)、负载(Payload)、签名(Signature),头部和负载以 JSON 形式存在,这就是 JWT 中的 JSON,三部分的内容都分别单独经过了 Base64 编码,以 .拼接成一个 JWT Token。

    JWT 的 Header 中存储了所使用的加密算法和 Token 类型。

    414f9f36fb280d0c35dfb93da2264180.png

    Payload 是负载,JWT 规范规定了一些字段,并推荐使用,开发者也可以自己指定字段和内容,例如下面的内容。

    7c5e0646ac41639fe21aa248a8562f29.png

    需要注意的是,Payload的内容只经过了 Base64 编码,对客户端来说当于明文存储,所以不要放置敏感信息。

    Signature 部分用来验证 JWT Token 是否被篡改,所以这部分会使用一个 Secret 将前两部分加密,逻辑如下。

    c286f3f18cc1ee3bc44a0af82e721fbd.png

    JWT 优势 & 问题

    JWT 拥有基于 Token 的会话管理方式所拥有的一切优势,不依赖 Cookie,使得其可以防止 CSRF 攻击,也能在禁用 Cookie 的浏览器环境中正常运行。

    而 JWT 的最大优势是服务端不再需要存储 Session,使得服务端认证鉴权业务可以方便扩展,避免存储 Session 所需要引入的 Redis 等组件,降低了系统架构复杂度。但这也是 JWT 最大的劣势,由于有效期存储在 Token 中,JWT Token 一旦签发,就会在有效期内一直可用,无法在服务端废止,当用户进行登出操作,只能依赖客户端删除掉本地存储的 JWT Token,如果需要禁用用户,单纯使用 JWT 就无法做到了。

    基于 JWT 的实践

    既然 JWT 依然存在诸多问题,甚至无法满足一些业务上的需求,但是我们依然可以基于 JWT 在实践中进行一些改进,来形成一个折中的方案,毕竟,在用户会话管理场景下,没有银弹。

    前面讲的 Token,都是 Access Token,也就是访问资源接口时所需要的 Token,还有另外一种 Token,Refresh Token,通常情况下,Refresh Token 的有效期会比较长,而 Access Token 的有效期比较短,当 Access Token 由于过期而失效时,使用 Refresh Token 就可以获取到新的 Access Token,如果 Refresh Token 也失效了,用户就只能重新登录了。

    在 JWT 的实践中,引入 Refresh Token,将会话管理流程改进如下:

    客户端使用用户名密码进行认证服务端生成有效时间较短 Access Token(例如 10 分钟),和有效时间较长的 Refresh Token(例如 7 天)客户端访问需要认证的接口时,携带 Access Token如果 Access Token 没有过期,服务端鉴权后返回给客户端需要的数据如果携带 Access Token 访问需要认证的接口时鉴权失败(例如返回 401 错误),则客户端使用 Refresh Token 向刷新接口申请新的 Access Token如果 Refresh Token 没有过期,服务端向客户端下发新的 Access Token客户端使用新的 Access Token 访问需要认证的接口

    d258b738f69ae88e2c59e0c296ebdffa.png

    将生成的 Refresh Token 以及过期时间存储在服务端的数据库中,由于 Refresh Token 不会在客户端请求业务接口时验证,只有在申请新的 Access Token 时才会验证,所以将 Refresh Token 存储在数据库中,不会对业务接口的响应时间造成影响,也不需要像 Session 一样一直保持在内存中以应对大量的请求。

    上述的架构,提供了服务端禁用用户 Token 的方式,当用户需要登出或禁用用户时,只需要将服务端的 Refresh Token 禁用或删除,用户就会在 Access Token 过期后,由于无法获取到新的 Access Token 而再也无法访问需要认证的接口。这样的方式虽然会有一定的窗口期(取决于 Access Token 的失效时间),但是结合用户登出时客户端删除 Access Token 的操作,基本上可以适应常规情况下对用户认证鉴权的精度要求。

    总结

    JWT 的使用,提高了开发者开发用户认证鉴权功能的效率,降低了系统架构复杂度,避免了大量的数据库和缓存查询,降低了业务接口的响应延迟。然而 JWT 的这些优点也增加了 Token 管理上的难度,通过引入 Refresh Token,既能继续使用 JWT 所带来的优势,又能使得 Token 管理的精度符合业务的需求。

    展开全文
  • 什么oauth2中的授权码模式 在获取token之前非要先到资源服务器获取一个code 然后才使用资源服务器的code去资源服务器去申请token?而不能在回跳时直接返回token呢? 首先,从产品交互上,我们需要浏览器跳转到...
  • 知乎:https://zhuanlan.zhihu.com/p/52300092HTTP 一个无状态的协议,一次请求结束后,下次在发送服务器就不知道这个请求谁发来的了(同一个 IP 不代表同一个用户),在 Web 应用中,用户的认证和鉴权非常重要...
  • 微博这种模式,微信也这种模式。总结来说,就是简单的二步: 1.获取code 2.根据code,去获取access_token 以微博为例 ...
  • Cloud Token是什么?收益如何? Cloud Token收益如何 Cloud Token亮点 一、没有锁长期,本金随时进出 二、傻瓜式躺赚模式随进随出不锁仓无任何限制,目前支持ETH BTC BTH TUSD等主流货币 三、所有的币都是在公...
  • 转载请注明出处:基于Token的登陆验证模式 ...什么是基于cookie-session的验证模式?  Cookie网站储存在用户浏览器本地,用于对用户状态信息及用户身...
  • token

    千次阅读 2018-07-03 14:59:52
    什么要使用token? 因为HTTP协议开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证好的用户,才允许调用API。 目前主流的访问权限控制/认证模式 Bearer Token...
  • Sa-Token是什么? sa-token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题 框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见...
  • Sa-Token是什么? Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题 框架针对踢人下线、自动续签、前后台分离、分布式会话……等常见...
  • 简介在OAuth 2 是什么-带你搞懂授权码流程中我们讲到了授权码流程的OAuth 2。这一篇中,我们将讲解的是另一种设计到用户交互的流程,简化流程(implicit flow)。简化流程也是曾经经常使用的一种模式,特别是以...
  •  上一篇我们介绍了什么是JWT,以及如何在asp.net core api项目中集成JWT权限认证。传送门:https://www.cnblogs.com/7tiny/p/11012035.html  很多博友在留言中提出了疑问: 如何结合jwt认证对用户进行API授权...
  • 1,access_token过期可以通过refresh_token获取,而为什么不是再获取一下access_token就好呢 2,refresh_token过期呢?接口怎么获取? 先问问度娘 网上基本都介绍微信开发的模式,有一个人写的还比较有意思 **...
  • JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息。和?Cookie-Session 的模式不同,JSON Web Token(JWT)使用 Token 替换了 ...jwt 是什么?JWTs 是 J...
  • 从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种模式是互斥关系,即两种模式不能同时开启。那两种模式有什么区别呢?作为开发人员到底要开启哪一种呢? 编辑模式:主要针对非编程人员及...
  • 什么是Token token是由服务器生成的一串加密后的字符串,用来作为客户端进行请求的一个标识。 用户第一次成功登录后,服务器会针对这个用户生成一个token,用来标识这个用用户,并将生成的token返回给客户端,以后...
  • 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。 详细介绍参考:...
  • Sa-Token是什么? sa-token是一个轻量级Java权限认证框架,主要解决:登录认证,权限认证,会话会话,单点登录,OAuth2.0等长度权限相关问题 框架针对踢人下线,自动续签,前后台分离,分散会话……等常见业务进行N...
  • JWT(JSON WEB Token)

    2018-07-23 11:46:00
    同样基于oauth2的授权模式,但里面返回不是我们原来使用的那种token,而是另一种JWT(JSON WEB Token)。这里只介绍JWT,具体实现后面在用一篇文章进行介绍。 1 什么是JSON Web Token 2 JSON Web Token 用途 3 ...
  • 说起令牌,仿佛回到了封建时代,一掏出令牌,其他人都知道你是什么身份了。 而在web系统中,前后端的业务交互也往往需要附带身份数据,先姑且把这个数据统称为Token (令牌) 。 面向有状态HTTP请求:在前后端不...
  • JAVA设计模式--备忘录模式

    万次阅读 多人点赞 2017-02-10 21:36:36
    备忘录(Memento)模式又叫作快照(Snapshot)模式或Token模式一种对象的行为模式。在备忘录模式里,一个备忘录一个对象,它存储另一个对象(备忘录的原发器)在某个瞬间的内部状态。备忘的目的就是为了以后在需要...
  • 什么现在都采用前后端分离开发模式? 前后端分离最重要的一点登录校验,那Session与Token到底有什么区别?两张图告诉你。 Session Token
  • Token是什么区块链最重要的应用就是价值在互联网上直接流通。通过实体或虚拟资产的Token化,将资产上链,实现资产的液化,能直接通过网络来跨国界、短时差、低成本进行资产交易与转移。很多人把To...
  • 1.为什么需要token? 因为http协议无状态的,因此它无法判断用户的登录状态。token的出现可以解决这个问题。 2.通用的两种身份验证方式 一般判断用户的身份有两种通用的方式,一种 cookie+session的模式 (用户用...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 254
精华内容 101
关键字:

token模式是什么