在小工具中维护状态(在一个浏览器里同时登陆两个账号同时进行操作的实现)

冰盐肤木 PHP 2016年09月17日 收藏

在小工具中维护状态(在一个浏览器里同时登陆两个账号同时进行操作的实现)


版权声明

本博客(小MM)所有文章均为原创,如果你对本博客的文章感兴趣,可以留下你的QQ或者加本人的QQ:676588498,如果转载本博客的文章,请注明出处,并附加说明和连接(http://www.cnblogs.com/mier),谢谢支持哦 


    今天翻出那本花了160大洋从新华书店买来的<<c# 3.0高级编程 第五版>>,好久没看c#了,都快忘了,不过我从来没有后悔当初c#刚入门就转而投入web编程和php,javascript之类的东西了,至今,当我翻开ASP.NET的章节时,读到asp.net的维护状态的方式,我感到如果当初我是先看这本书的,那我估计现在已经被微软搞晕了,被微软奴化了,被微软封装了.
    初学编程者,我建议不要想着在微软的技术中想着进阶,因为那是一个很慢的过程,微软的确给大家做了很多好事,他把很多操作系统底层的操作封装起来使我们可以很方便地调用,但是在封装的时候,他也把具体的实现给我们封装起来了,其实一开始我在学微软的技术的时候就觉得自己好像一个工人(与匠人相比),日复一日地用vs安心地编着代码,却不知道为什么会是这样的,为什么我们要这样写代码呢?这就是微软,他用一种特殊的方式奴化着我们的思想,当我们有一天脱离开微软的时候才发现自己什么都没搞明白.
    我是想说初学者想进阶的时候或许可以暂时脱离一下微软的技术,去研究一下linux或者某些开源语言.
   
    废话不说,最近接触到一个新的词语,叫做"REST",相信很多人已经听说过了,我是在看ruby on rails时看到的,据说现在的新版本的rails是遵循REST服务来设计的,REST到底是什么呢,看了很多文章,也看了很多教程,可是还是迷糊的很,据我理解就是尽量减少客户端与服务器的通信量吧,然后充分利用客户端form表单的四个操作(貌似有的浏览器不支持,说用js模拟也算),反正,在很多文章里都提到了状态的维护这个问题,看来这也是REST的重要组成部分.
    为什么要提及状态的维护呢,大家应该都知道,web服务的是无状态的,也就是你在客户端的操作服务器并不知道,服务器所知道的只是最后你提交到服务器的结果,但是我们可以通过某些方式来模拟状态,这点上c#.net做的非常不错,如果是初学者看了c#.net肯定以为web服务是有状态的,因为它看起来是那么有状态,可是c#其实是靠服务器和客户端表单中的一个隐藏域的交互来获取状态的,每次你点击一个按钮,都会刷新页面,然后调用服务器逻辑,服务器逻辑根据你表单里的一个隐藏域判断你的状态,当我看到asp.net是这样工作的时候,我感到很惊讶,因为我不敢想象这样的实现方式会造成对服务器的多么极其不良的影响,没点击一个按钮都会调用服务器端逻辑,这是什么逻辑?
    asp.net的实现方式完全背离了 REST的理念,造成了对网络的大量消耗和浪费,在这点上其他的语言做的还是不错的,例如php,所以我在听说REST后,感觉没什么新奇啊,我平常都是这样用的啊,但是对于asp.net的程序员来说就不一样了.虽然php对于REST的理念还是比较符合的,但是也有一些地方背离了REST的原则,例如:session的使用.
    session的使用时极其广泛的,几乎每个网站都会用到这种技术,它利用类似asp.net的实现方式来保持状态,但是二者本质上有所不同,php是用cookie或者url来传输一个id标识字符串的,服务器通过存储在文件中的id值与客户端传过来的标识交互维护状态(之所以存储在文件中式因为php的执行方式,每次调用服务器完毕后php脚本就会退出,下次执行时再从文件里取出session变量,这点和asp.net以及ruby,python有本质上的区别,后三者将状态维护在变量中,而不是文件中),可以想象,php在维护这个状态的时候消耗了大量的资源,而且当存在集群式服务器的时候session的管理是个很复杂的问题,而在REST中,一个主要观点就是杜绝类似session的维护状态的方法.
    不用session如何维护状态呢,先说一个用session无法完成的状态维护的例子吧:
        有一个商店,它有很多用户,而有一个用户有一天突然想用两个账号同时登录这个网站,并且每个账号单独操作,能同时完成买卖的工作.
     你会想着如何去实现这种情况呢,其实很久以前就有人提出这种想法,但是我从来没有见过有人给出解决方案,而其实这种操作是可以完成的,下面进行说明:
        (1)第一种方法:把所有的操作放在一个页面中,例如现在流行的google gadget,一个好的小工具应用时应该不刷新页面就能完成所有操作的,这时候,无需session就可以维护状态,因为你只需要在javascript中存储用户的信息即可,之前,你可以让用户登陆,然后在服务器端验证,并将必要的用户信息传回客户端的javascript,这些javascript信息可以用来标识用户的状态,在此期间,用户向服务器的请求都会跟着这些状态信息,从而在服务中可以根据传过来的数据来判断对哪个用户进行操作,而无须再服务器端存储session,当然你也可以另开一个页面,重新登录一个账号,这两个账号是没有相互干扰的,当然,前提是所有的操作都不会引起页面刷新,而只是用ajax来异步交互.
        (2)第二种方法有点复杂,它可以允许客户端刷新页面,也可以跳转页面,也可以打开新窗口,但是仍然保持不同用户的不同状态.具体实现我还没想明白,因为我对某些知识的了解还是不够多,我想可以用javascript存储状态,但是跳转页面后把状态转到哪里是一个问题,这样想来,貌似避免不了服务器端的存储,而且用cookie来存储信息有安全性和大小限制,在大应用中个不太现实,也可以不要跳出你的脚本,也就是不要跳到任何的静态页面或者其他不受控制的页面,然后你可以在每个页面中包含一个初始化的javascript对象,它又服务器根据传来的页面中的状态信息构建在这个页面的状态,这样来保持状态有很多限制,估计不太现实.总之我还没有想好如何实现这种形式.

            至于google的小工具中,做到第一点就好了,只要有点javascript的功底,实现在一个页面中无刷新地实现所有的功能,然后用javascript保存状态就可以了,每次交互,都用ajax发送状态信息即可
            有点乱了,因为没有想出第二种实现方法,但是就是提供种思路,现在做任何网页我都倾向于将其做成类似桌面的应用,然后用javascript保存状态,这种应用的方式可以减少服务器端的大量负担,也可以减少大量的网络带宽,这是一种趋势.