Cookie和Session对比

1. Cookie

什么是cookie(储存在用户本地终端上的数据)

Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

什么是会话

会话是指一个终端用户与交互系统进行通讯的过程。举个栗子:浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话一样),都视为一次会话,直到浏览器关闭,本次会话结束。

Http无状态

无状态是指Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后Web服务器返回响应(Response),连接就被关闭了,在服务器端不保留连接的有关信息。

Cookie的使用

Cookie的创建

// 由服务器进行创建
Cookie cookie = new Cookie(key,value);  //以键值对的方式存放内容,
response.addCookie(cookie);  // 通过响应对象将Cookie对象写入到响应头,发送回浏览器端
// response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。

注意:一旦cookie创建好了,就不能在往其中增加别的键值对,但是可以修改其中的内容,
cookie.setValue();  //将key对应的value值修改	

读取请求头中Cookie对象
Cookie cookieArray[] = request.getCookies()

Cookie的工作原理

image-20211112175117977

设置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都会被浏览器给删除。
    

设置服务器端获取cookie的访问路径

public void setPath(String uri) { this.path = uri;}
path属性决定允许访问Cookie的路径。比如,设置为"/"表示允许所有路径都可以使用Cookie
cookie默认路径:当前访问的servlet父路径。
// 可以设置服务器端获取cookie的访问路径,而并非在服务器端的web项目中所有的servlet都能访问该cookie。
    
setPath("/");  //在该服务器下,任何项目,任何位置都能获取到cookie,
setPath("/test/");  //在test项目下任何位置都能获取到cookie。

Cookie的生命周期

Servlet调用构造方法创建
默认情况下,Cookie对象存放在浏览器的内存中。意味着浏览器关闭时Cookie对象就会被销毁
特殊情况下,要求浏览器将接收的Cookie对象存放客户端计算机的硬盘同时指定Cookie对象在硬盘上存活时间。
    在未达到存活时间之前,关闭浏览器,关闭服务器,关闭计算机都不会导致Cookie对象销毁
cookie.setMaxAge(存活时间);存活时间以秒为单位

Cookie注意细节

1. 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
2. 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie3. 浏览器一般只允许存放300Cookie,每个站点最多存放20Cookie,每个Cookie的大小限制为4KB。
4. 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),
用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。
将最大时效设为0则是命令浏览器删除该cookie。
5. cookie 不安全,可能泄露用户信息。浏览器支持禁用cookie操作。

Cookie案例

  1. 记住用户名
    登录时,在服务器端获取到用户名,然后创建一个cookie,将用户名存入cookie中,发送回浏览器端,然后浏览器下次在访问登录页面时,先拿到cookie,将cookie中的信息拿出来,看是否保存了该用户名,如果保存了,那么直接用他,如果没有,则自己手写用户名。
  2. 历史记录
    比如购物网站,都会有我们的浏览记录的,实现原理其实也是用cookie技术,每浏览一个商品,就将其存入cookie中,到需要显示浏览记录时,只需要将cookie拿出来遍历即可。

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的

2. Session

什么是Session

Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

Session的工作原理

用户通过浏览器第一次访问OneServlet。OneServlet在提供服务过程中要求 Tomcat为当前用户开发一个【私人储物柜(HttpSession对象)】。Tomcat在创建这个HttpSessio对象时,生成一个唯一编号.这个编号称为sessionId。在OneServlet工作完毕后。Tomcat将sessionId作为一个Cookie对象(‘JSESSIONID’,柜子编号),写入到响应头然后浏览器在接收到响应包之后,将这个cookie保存在浏览器的内存中等到用户第二次来访问这个网站时,自动发送这个cookie对象此时提供服务的TwoServlet 就可以凭借柜子编号得到用户的私人储物柜并读取由OneServlet写入的共享数据

image-20211112193818958

获取session

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

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

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

session属性操作

// 用来存放一些信息,然后才能共享信息 
setAttrubute(key,value);
getAttribute(key);

session生命周期

误解:只要关闭浏览器,session就消失

大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session

session的生命周期
    创建:用户第一次向Tomcat索要会话作用域对象时,由Tomcat负责生成调用 getSession()
	销毁:由于JSESSIONID只能存放在浏览器内存中,所以在浏览器关闭时用户与自己的HttpSession对象失去联系
		由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了失效时间,一般是30分钟,当距离客户端
    	上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
    
    销毁方式一:调用Session的invalidate方法。
    	HttpSession session = request.getSession();
		session.invalidate();//注销该request的所有session
	销毁方式二:设置session的失效时间
        1. web.xml中
        <session-config>
    		<session-timeout>30</session-timeout>
		</session-config>
        2. 在程序中手动设置
        session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期

session的过期时间是从什么时候开始计算的?
    从session不活动的时候开始计算,如果session一直活动,session就总不会过期。从该Session未被访问,开始计时; 一旦Session被访问,计时清0;

session id的URL重写

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。

HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。

注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

手动方式: url;jsessionid=....
api方式:
encodeURL(java.lang.String url) // 进行所有URL重写

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

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

总结

什么是cookie和什么是session?

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

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

cookie的工作原理?session的工作原理?

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值