热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

web开发_web开发会话机制,Cookie和Session详解

在网上看见一篇不错的文章,写的详细。以下内容引用那篇博文。转《http://www.cnblogs.com/whgk/p/6422391.

在网上看见一篇不错的文章,写的详细。

以下内容引用那篇博文。转《http://www.cnblogs.com/whgk/p/6422391.html》,在此仅供学习参考之用。

一、会话机制

    Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是COOKIE与Session。COOKIE通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

    一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话一样),都视为一次会话,直到浏览器关闭,本次会话结束。其中注意,一个浏览器就相当于一部电话,如果使用火狐浏览器,访问服务器,就是一次会话了,然后打开google浏览器,访问服务器,这是另一个会话,虽然是在同一台电脑,同一个用户在访问,但是,这是两次不同的会话。

    知道了什么是会话后,思考一个问题,一个浏览器访问一个服务器就能建立一个会话,如果别的电脑,都同时访问该服务器,就会创建很多会话,就拿一些购物网站来说,我们访问一个购物网站的服务器,会话就被创建了,然后就点击浏览商品,对感兴趣的商品就先加入购物车,等待一起付账,这看起来是很普通的操作,但是想一下,如果有很多别的电脑上的浏览器同时也在访问该购物网站的服务器,跟我们做类似的操作呢?服务器又是怎么记住用户,怎么知道用户A购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,不能放入用户B或用户C的购物车内的呢?所以就有了COOKIE和session这两个技术,就像第一行说的那样,COOKIE和session用来跟踪用户的整个会话,

     COOKIE和Session之间的区别和联系

      假如一个咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:

      1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。但是http协议本身是无状态的

      2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。也就是COOKIE。 顾客就相当于浏览器,COOKIE如何工作,下面会详细讲解

      3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

      由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说COOKIE机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于COOKIE机制来达到保存标识的目的,但实际上它还有其他选择

 

二、COOKIE

     上面已经介绍了为什么要使用COOKIE,以及COOKIE的一些特点,比如保存在客户端,用来记录用户身份信息的,现在来看看如何使用COOKIE。

     借着上面会员卡的例子来说,采用的是第二种方案,其中还需要解决的问题就是:如何分发会员卡,会员卡的内容,客户如何使用会员卡,会员卡的有效日期,会员卡的使用范围

     1、如何分发会员卡、会员卡的内容:也就是COOKIE是如何创建的?创建后如何发送给客户端?

        由服务器进行创建,也就相当于咖啡店来创建会员卡,在创建会员卡的同时,就会将会员卡中的内容也给设置了

          COOKIE COOKIE = new COOKIE(key,value);  //以键值对的方式存放内容,

          response.addCOOKIE(COOKIE);  //发送回浏览器端

        注意:一旦COOKIE创建好了,就不能在往其中增加别的键值对,但是可以修改其中的内容,

          COOKIE.setValue();  //将key对应的value值修改

     2、客户如何使用会员卡,COOKIE在客户端是如何工作的,工作原理是什么?

        技术分享图片

        这个过程就相当于,咖啡店创建好了会员卡,并且已经设置了其中的内容,交到了客户手中,下次客户过来时,就带着会员卡过来,就知道你是会员了,然后咖啡店就拿到你的会员卡对其进行操作。

     3、会员卡的有效日期?也就是COOKIE也是拥有有效日期的。

        这个可以自由设置,默认是关闭浏览器,COOKIE就没用了。

        COOKIE.setMaxAge(expiry);  //设置COOKIE被浏览器保存的时间。

          expiry:单位秒,默认为-1,

             expiry=-1:代表浏览器关闭后,也就是会话结束后,COOKIE就失效了,也就没有了。

             expiry>0:代表浏览器关闭后,COOKIE不会失效,仍然存在。并且会将COOKIE保存到硬盘中,直到设置时间过期才会被浏览器自动删除,

             expiry=0:删除COOKIE。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,COOKIE都会被浏览器给删除。

    

    4、会员卡的使用范围?比如星巴克在北京有一个分店,在上海也有一个分店,我们只是在北京的星巴克办理了会员卡,那么当我们到上海时,就不能使用该会员卡进行打折优惠了。而COOKIE也是如此,可以设置服务器端获取COOKIE的访问路径,而并非在服务器端的web项目中所有的servlet都能访问该COOKIE。

      COOKIE默认路径:当前访问的servlet父路径。

        例如:http://localhost:8080/test01/a/b/c/SendCOOKIEServlet

          默认路径:/test01/a/b/c  也就是说,在该默认路径下的所有Servlet都能够获取到COOKIE,/test01/a/b/c/MyServlet 这个MyServlet就能获取到COOKIE。

      修改COOKIE的访问路径

        setPath("/");  //在该服务器下,任何项目,任何位置都能获取到COOKIE,

          通途:保证在tomcat下所有的web项目可以共享相同的COOKIE 

                 例如:tieba , wenku , beike 多个项目共享数据。例如用户名。

        setPath("/test01/");  //在test01项目下任何位置都能获取到COOKIE。

 

    5、总结COOKIE:

        工作流程:

          1. servlet创建COOKIE,保存少量数据,发送浏览器。

              2. 浏览器获得服务器发送的COOKIE数据,将自动的保存到浏览器端。

                3. 下次访问时,浏览器将自动携带COOKIE数据发送给服务器。

        COOKIE操作

          1.创建COOKIE:new COOKIE(name,value)

              2.发送COOKIE到浏览器:HttpServletResponse.addCOOKIE(COOKIE)

          3.servlet接收COOKIE:HttpServletRequest.getCOOKIEs()  浏览器发送的所有COOKIE

         COOKIE特点

              1. 每一个COOKIE文件大小:4kb , 如果超过4kb浏览器不识别

              2. 一个web站点(web项目):发送20个

                3.一个浏览器保存总大小:300个

                4.COOKIE 不安全,可能泄露用户信息。浏览器支持禁用COOKIE操作。

              5. 默认情况生命周期:与浏览器会话一样,当浏览器关闭时COOKIE销毁的。---临时COOKIE

        COOKIE api

          getName() 获得名称,COOKIE中的key

          getValue() 获得值,COOKIE中的value

          setValue(java.lang.String newValue)  设置内容,用于修改key对应的value值。

          setMaxAge(int expiry) 设置有效时间【】

          setPath(java.lang.String uri)  设置路径【】  

          setDomain(java.lang.String pattern) 设置域名 , 一般无效,有浏览器自动设置,setDomain(".itheima.com")

             www.itheima.com / bbs.itheima.com 都可以访问

             a.b.itheima.com无法访问

             作用:设置COOKIE的作用范围,域名+路径在一起就构成了COOKIE的作用范围,上面单独设置的setPath有用,是因为有浏览器自动设置该域名属性,但是我们必须知道有这么个属性进行域名设置的

          isHttpOnly()  是否只是http协议使用。只能servlet的通过getCOOKIEs()获得,Javascript不能获得。

          setComment(java.lang.String purpose) (了解)  //对该COOKIE进行描述的信息(说明作用),浏览器显示COOKIE信息时能看到

          setSecure(boolean flag) (了解)  是否使用安全传输协议。为true时,只有当是https请求连接时COOKIE才会发送给服务器端,而http时不会,但是服务端还是可以发送给浏览端的。

          setVersion(int v) (了解)  参数为0(传统Netscape COOKIE规范编译)或1(RFC 2109规范编译)。这个没用到,不是很懂

        注意:COOKIE不能发送中文,如果要发送中文,就需要进行特别处理。

          JDK提供工具,进行编码

            URLEncoder:编码

            URLDecoder:解码

            //发送COOKIE

            COOKIE COOKIE = new COOKIE(URLEncoder.encode("哈哈"),URLEncoder.encode("呵呵"));

            response.addCOOKIE(COOKIE);

            //获得COOKIE中文内容

            URLDecoder.decoder(request.getCOOKIE().getName);  //获取key

            URLDecoder.decoder(request.getCOOKIE().getValue);  //获取value  

     6.COOKIE案例

         6.1、记住用户名

            登录时,在服务器端获取到用户名,然后创建一个COOKIE,将用户名存入COOKIE中,发送回浏览器端,然后浏览器下次在访问登录页面时,先拿到COOKIE,将COOKIE中的信息拿出来,看是否保存了该用户名,如果保存了,那么直接用他,如果没有,则自己手写用户名。

         6.2、历史记录

            比如购物网站,都会有我们的浏览记录的,实现原理其实也是用COOKIE技术,每浏览一个商品,就将其存入COOKIE中,到需要显示浏览记录时,只需要将COOKIE拿出来遍历即可。  

 

三、Session

     同样,会员卡的例子的第三种方法,发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。 这就是session的用法,在服务器端来保持状态,保存一些用户信息。

     功能作用:服务器用于共享数据技术,

           技术分享图片 

     session原理分析:

        首先浏览器请求服务器访问web站点时,程序需要为客户端的请求创建一个session的时候,服务器首先会检查这个客户端请求是否已经包含了一个session标识、称为SESSIONID,如果已经包含了一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用,如果客户端请求不包含session id,则服务器为此客户端创建一个session并且生成一个与此session相关联的session id,sessionid 的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将在本次响应中返回到客户端保存,保存这个sessionid的方式就可以是COOKIE,这样在交互的过程中,浏览器可以自动的按照规则把这个标识发回给服务器,服务器根据这个sessionid就可以找得到对应的session,又回到了这段文字的开始。

     获取session:

        request.getSession();  //如果没有将创建一个新的,等效getSession(true);

          有些人不理解,为什么是通过request来获取session,可以这样理解,在获取session时,需要检测请求中是否有session标识,所以需要用request来获取

        request.getSession(boolean);  //true:没有将创建,false:没有将返回null

 

     session属性操作:

        xxxAttribute(...)

          用来存放一些信息,然后才能共享信息 

          setAttrubute(key,value);

          getAttribute(key);

     

     session生命周期

        常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话COOKIE来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的COOKIE被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session 

        恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,一般是30分钟,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间

        我们也可以自己来控制session的有效时间

          session.invalidate()将session对象销毁

          setMaxInactiveInterval(int interval) 设置有效时间,单位秒

          在web.xml中配置session的有效时间

            

              30   单位:分钟

            

    

        所以,讨论了这么就,session的生命周期就是:

            创建:第一次调用getSession()

            销毁:

               1、超时,默认30分钟

               2、执行api:session.invalidate()将session对象销毁、setMaxInactiveInterval(int interval) 设置有效时间,单位秒

               3、服务器非正常关闭

                  自杀,直接将JVM马上关闭

                  如果正常关闭,session就会被持久化(写入到文件中,因为session默认的超时时间为30分钟,正常关闭后,就会将session持久化,等30分钟后,就会被删除)

                  位置: D:\\java\\tomcat\\apache-tomcat-7.0.53\\work\\Catalina\\localhost\\test01\\SESSIONS.ser

 

     session id的URL重写

         当浏览器将COOKIE禁用,基于COOKIE的session将不能正常工作,每次使用request.getSession() 都将创建一个新的session。达不到session共享数据的目的,但是我们知道原理,只需要将session id 传递给服务器session就可以正常工作的。

        解决:通过URL将session id 传递给服务器:URL重写

          手动方式: url;jsessiOnid=....

          api方式:

               encodeURL(java.lang.String url) 进行所有URL重写

               encodeRedirectURL(java.lang.String url) 进行重定向 URL重写 

               这两个用法基本一致,只不过考虑特殊情况,要访问的链接可能会被Redirect到其他servlet去进行处理,这样你用上述方法带来的session的id信息不能被同时传送到其他servlet.这时候用encodeRedirectURL()方法就可以了 

          如果浏览器禁用cooke,api将自动追加session id ,如果没有禁用,api将不进行任何修改。

          注意:如果浏览器禁用COOKIE,web项目的所有url都需进行重写。否则session将不能正常工作

        当禁止了COOKIE时,

            技术分享图片    

 

四、总结

    知道了什么是COOKIE和什么是session?

       COOKIE是一种在客户端记录用户信息的技术,因为http协议是无状态的,为了解决这个问题而产生了COOKIE。记录用户名等一些应用

       session是一种在服务端记录用户信息的技术,一般session用来在服务器端共享数据,

    COOKIE的工作原理?session的工作原理?

       COOKIE工作原理,可以看上面讲解COOKIE的那张图,COOKIE是由服务器端创建发送回浏览器端的,并且每次请求服务器都会将COOKIE带过去,以便服务器知道该用户是哪一个。其COOKIE中是使用键值对来存储信息的,并且一个COOKIE只能存储一个键值对。所以在获取COOKIE时,是会获取到所有的COOKIE,然后从其中遍历。

             技术分享图片

       session的工作原理就是依靠COOKIE来做支撑,第一次使用request.getSession()时session被创建,并且会为该session创建一个独一无二的sessionid存放到COOKIE中,然后发送会浏览器端,浏览器端每次请求时,都会带着这个sessionid,服务器就会认识该sessionid,知道了sessionid就找得到哪个session。以此来达到共享数据的目的。 这里需要注意的是,session不会随着浏览器的关闭而死亡,而是等待超时时间。

  

      如果对COOKIE和session还有不理解的地方,用大家肯定都会用,就是需要理解,为什么需要使用COOKIE和session,可以看看那个会员卡的例子,COOKIE和session只是为了解决http协议无状态的这种缺陷,为了记录用户信息,记录浏览器和服务器之间的状态和衍生出来的。


推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 【MEGA DEAL】Ruby on Rails编码训练营(97%折扣)限时特惠!
    本文介绍了JCG Deals商店提供的Ruby on Rails编码训练营的超值优惠活动,现在只需29美元即可获得,原价为$1,296。Ruby on Rails是一种用于Web开发的编程语言,即使没有编程或网页设计经验,也能在几分钟内构建专业的网站。该训练营共有6门课程,包括使用Ruby on Rails进行BDD的课程,使用RSpec 3和Capybara等。限时特惠,机会难得,赶快行动吧! ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文详细介绍了解决全栈跨域问题的方法及步骤,包括添加权限、设置Access-Control-Allow-Origin、白名单等。通过这些操作,可以实现在不同服务器上的数据访问,并解决后台报错问题。同时,还提供了解决second页面访问数据的方法。 ... [详细]
author-avatar
手机用户2602923801
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有