zoukankan      html  css  js  c++  java
  • [转载]JAVA中SESSION和COOKIE的解释

    为什么需要cookie:
    因为HTTP是无状态的协议,所以我们在使用浏览器访问网站的时候,服务器是怎样来区别是哪个浏览器发送的请求呢,服务器是如何给不同的浏览器发送不同的信息,这就需要我们的cookie来解决问题了。
    cookie机制是采用了一种在客户端保存状态的方案,他是用户端的存储机制,当然他也需要用户端主动去开启cookie支持。
    session机制是采用一种在客户端和服务器之间保持状态的方案,这是怎样的一种感念呢?如果我们在服务器端保存一个用户访问的标识,那么这种单一的保持我们还是无法辨别这是哪个客户端发来的请求,所以我们仍然需要在客户端保存一个相同服务器端的标识,所以session机制还需要借助cookie机制来达到他的目的。
    cookie和session的工作原理:
    cookie:当用户访问到网站时,用户获得不仅仅是这些页面,同时也获取了cookie,并且能够保存在本地磁盘中,在cookie中记录了每次用户访问站点的日期和时间信息或者是用户名密码等信息,用户在和服务器进行请求响应的同时也在不断交换其产生的cookie,并且用户会将最新的cookie存储在磁盘中,对于不同的网站,客户端存储不同的cookie信息。如果用户在关闭掉浏览器后,再次请求相同的网站信息,浏览器便会在本地磁盘上查询是否有于该URL相关联的cookie,如果有那么浏览器便将这个cookie和你的请求信息一同发送给服务器。从上面的工作流程中我们可以发现,cookie是和站点相关联的客户端保存信息的机制。只要你访问这个站点,就会用到你刚才保存的cookie。
    session:当程序需要为某个客户端的请求创建一个session的时候,服务器会首先检查这个客户端的请求里是否包含有一个session的标识,我们称这个标识为sessionID,如果有那么就说明已经为客户端创建过session,服务器端就会按照这个sessionID将这个session检索出来(如果查找不到,就新建一个session),如果没有那么我们就新建一个session,并生成一个相关联的sessionID,并在本次响应中返回给客户端,这个session在服务器端会将它保存起来,而在客户端,我们怎样做呢,这里就用到了cookie的工作方式将这个sessionID保存起来,这样在当前用户不关闭浏览器的请况下,我们就会按照规则将这个标志传送给服务器。一般这个cookie的名字就类似于SESSIONID,这个sessionID的值是一个既不会重复,也没有固定规则的随机字符串。这里我们就发现了session和cookie的不同之处,session是和即时的会话相关联的,如果你将浏览器关闭,那么你的这个sessionID也会跟随着消失,这是为什么呢?有人说既然采用了cookie的保存方式为什么还会消失呢?因为他们的保存位置不同,在cookie的工作原理中我们看到了cookie是保存在本地磁盘的,而对于session呢,虽然我们采用了cookie的保存方式,但是并没有将他保存在本地磁盘,而是将它保存在了浏览器缓存里,当然你将浏览器关闭之后,缓存清空,那么你保存的session当然就会消失。而此时服务器上保存的sessionID则还没有删除,这就迫使服务器给sessionID设定了一个超时时间,如果超过了这个超时时间,服务器就可以认为客户端已经停止了活动,那么服务器自动删除掉这个sessionID来节约服务器的存储空间。而各个浏览器都有禁用cookie的功能,那么如果客户端禁用掉了cookie的功能后,我们应该怎么办呢?
    通常会有以下三种方法:
    一种URL重写的技术,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
    这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。
    为了在整个会话的过程中始终保持状态,那么就必须在每个客户端请求服务器的路径后面都要添加上essionID。
    一种是隐藏表单技术,。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单
    <form name="testform" action="/xxx">
    <input type="text">
    </form>
    在被传递给客户端之前将被改写成
    <form name="testform" action="/xxx">
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
    <input type="text">
    </form>
    这种技术现在不经常使用。

    通过以上的分析我们有了persistent cookies,就是代表我们通常所说的cookie;session cookie,代表我们通常所说的session。
  • 相关阅读:
    Java之装饰模式
    Sharding-jdbc(一)分库分表理解
    JVM(四)JVM的双亲委派模型
    JVM(三)JVM的ClassLoader类加载器
    JVM(二)JVM的结构
    JVM(一)JVM的概述与运行流程
    Redis随笔(六)RESP的协议规范
    Redis随笔(五)Jedis、jedisCluster的使用
    Collections.synchronizedList使用方法陷阱(1)
    Collections.synchronizedList使用方法
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480196.html
Copyright © 2011-2022 走看看