Cookie与Session是状态保持的两种技术。按照实现思路划分,分为了在客户端
保存用户状态信息的cookie技术和在服务端
保存用户状态信息的Session技术。
HTTP的无状态连接
我们先要知道一个概念,WEB程序是通过HTTP协议传输的,而HTTP协议是无状态的协议,对于事物处理没有记忆能力。
举个例子。比如你去超市买东西,付款成功后交易就结束了。当你想起有东西忘记买了,你第二次又去超市买,对于超市来说,这又是一次新的交易。此时你问收营员:我今天在超市买了多少钱的东西?服务员就蒙了,你是谁?你在我这里买过东西的?他完全不记得了。这种情况我们也可以理解,毕竟超市里面人员这么多,可收营员就那么几个,为了快速处理订单,服务员不可能把你的所有信息记录下来。
这样说你应该能理解无状态的连接了吧。计算机每次的请求响应都是独立的一次操作,计算机无法辨别请求与请求之间的关联,到底请求是不是同一个人发起的,计算机是不知道的。
在动态Web出现之前,无状态连接能满足加载静态资源的需求,而且用起来也十分高效,因为计算机只用关注发送请求与响应请求本身,不用进行状态信息的存储与处理。这种重复性的动作恰恰是计算机最擅长做的。
然而动态Web出现之后,Web页面显示的内容不再局限于静态内容,还需要根据不同人的不同操作来响应不同的内容,这就要求服务端能识别和存储不同用户发来的请求。Cookie和Session是在无状态连接的基础上,在请求信息中附加一个独一无二的用户标志信息来区别不同的用户的,达到了高效且有状态连接的目的。
Cookie
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致连接传送的数据量过大。
我们接着上面的例子讲。我第二次的东西也买完了,晚上的时候,我准备去报销我今天在超市的金额了,可是我回到家后把今天买了多少钱给忘记了。我去超市要求收营员重新把今天的订单信息调出来。你可能会说打开电脑查一下不就知道了,这里的情形有点不同,因为我们不保存数据,而是把数据提交到服务器处理,然后返回总计的结果。然后收营员说我不记得你今天买了什么,我只负责计算金额。没办法,你只能把你今天两次买的东西重新罗列一遍叫前台重新计算
cookie是什么
Cookie的原意是小饼干的意思,正如它的名字一样,Cookie实际上是一小段的文本信息,以键值对的形式呈现。
我们接着上面的例子讲解。一次两次还好,可经常有客户忘记了报销的金额,经常要客户和收营员做重复的事情,这样的状况要改进一下。再后来有人想到了能不能给用户开发票呢?发票上面至少应该有两项,订单id和商品列表。在用户第一次请求处理时,服务器在返回数据的同时也创建一张发票,当用户第二次购买的时候,只需要提供发票,服务员把发票信息(订单id、商品列表)和新的商品信息一起发给服务器处理,整合后发回来一张新的发票,这样的话你就能从你手头上的发票上面知道你今天到底在超市消费了多少。
Javaweb中Cookie的操作
属 性 名 | 描 述 |
---|---|
String name | 该Cookie的名称。Cookie一旦创建,名称便不可更改 |
Object value | 该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码 |
int maxAge | 该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1 |
boolean secure | 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false |
String path | 该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/” |
String domain | 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.” |
String comment | 该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明 |
int version | 该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范 |
Session
Session是什么
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
我们继续接着上面的例子讲吧。客户是方便了,收营员不乐意了,我每次请求的时候还要输入客户上次的发票信息,原先只要扫码新商品发到服务器就可以了,现在还要在原来的基础上附加每个客户的发票信息一起发送。客户却说问题是解决了,可是我把发票丢了怎么办呢?我以前的购买信息全没了呀。而且发票谁都可以看到我买了什么,我的信息安全没的保证的呀。
于是想到这个方法的人被两边吐槽,可是这个人很聪明,他很快想到了另外一种方法。你不是说输入信息麻烦吗?那就把商品信息存在服务器吧,不要返回订单信息了,如果你需要的话随时去服务器查好了,你只要输入id就可以查到这个人的账户了,账户里面的信息空间不仅大还方便获取呢。于是两边都对这种解决方案感到满意。这家店的生意也越做越好了!
所以说呀,Session是Cookie的改进。
Javaweb中Session的操作
方 法 名 | 描 述 |
---|---|
void setAttribute(String attribute, Object value) | 设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大 |
String getAttribute(String attribute) | 返回Session属性 |
Enumeration getAttributeNames() | 返回Session中存在的属性名 |
void removeAttribute(String attribute) | 移除Session属性 |
String getId() | 返回Session的ID。该ID由服务器自动创建,不会重复 |
long getCreationTime() | 返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime()) |
long getLastAccessedTime() | 返回Session的最后活跃时间。返回类型为long |
int getMaxInactiveInterval() | 返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效 |
void setMaxInactiveInterval(int second) | 设置Session的超时时间。单位为秒 |
boolean isNew() | 返回该Session是否是新创建的 |
void invalidate() | 使该Session失效 |
网友评论