cookie与session的区别

写在前面

最近在开发手机端的登陆功能,做到登陆自然而然就会涉及关于会话跟踪方面的知识。说到会话跟踪技术 :cookie和session,虽然以前在学校学过个大概,也知道有这样的说法:cookie是在客户端的,session是在服务器端的。显然知道这些还不够,所以还是决定深入研究一下。

先说说历史

大家都知道web程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。早期为了记录用户的状态时,就在浏览器记录用户信息cookie机制,每次请求都会往服务器发送这些数据,这样服务器就知道是谁在请求了,该对应返回什么样的数据,但是久而久之,安全性就暴露出来了。cookie是在本地的,在本地就会有人想着去修改cookie里面的数据,从而获取别人的信息。于是就有新的处理办法,改在服务器端记录用户信息。也就出现了session机制,一切用户的身份由服务器掌控。这就是cookie机制和session机制的历史。

分别介绍

Cookie机制

在浏览器记录用户的信息,每次请求都会往服务器去发送cookie,这样服务器就可以根据cookie值来划分访问的用户。如果 cookie 不包含到期日期,则可视为会话级别的cookie。 会话 cookie 存储在内存中,决不会写入磁盘。当浏览器关闭时,cookie 将从此永久丢失。如果 cookie 包含到期日期,则可视为持久性 cookie,这时会以文本文件的形式存在磁盘中,在指定的到期日期,cookie 将从磁盘中删除。

Cookie如何工作的

在java里面cookie被封装成了一个对象,通过Cookie[] cookies = request.getCookies(); 来获得请求中的cookie,其实里面是一个个键值对。服务器端创建cookie只需要
Cookie cookie = new Cookie("username","gray");response.addCookie(cookie);  如果创建了一个cookie,并将它发送到浏览器,默认情况下它是一个会话级别的cookie。

若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge(不能为负数),并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。存储在磁盘上的cookie就会被其他浏览器所共享,我们平时在浏览一些网站发现上面会弹出一些框框里面有我们浏览过的商品,那就是读了我们的本地cookie然后给我们推荐的。

Cookie的删除和修改

修改cookie只需要去new一个同名的cookie,add到response里面去就可以覆盖原有的,删除则是new一个同名cookie,将maxAge设置为0,然后add到response里面去。
ps: 在修改和删除操作时,cookie不止要同名,而且内容也要一致,不然浏览器将视为两个不同的Cookie不予覆盖

Cookie设置域名

domain属性是cookie的域名属性。domain表示的是cookie所在的域,默认为请求的地址。setDomain方法可以访问该Cookie的域名(必须以.开头)比如说有用到跨域访问时(两个不一样的二级域名)需要设置此值。cookie是不可跨域名的,这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。一般说为了安全性我们还是把cookie里面一些敏感字段加密。

Session机制

Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些。同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 name为 JSESIONID 的一个 Cookie。Session依据这个id来识别是否为同一用户(只认ID不认人)。

Session是如何工作的

在Java里面HttpSession被定义成一个接口,放在javax.servlet.http包下,Servlet里通过request.getSession()方法可以获取该客户的Session,这样我们就可以通过setAttribute/getAttribute来放置或获取我们想要的值了。但是,众所周知Session是存储在服务器内存中的,你数据放多了反而会增加服务器的压力,所以我们要善用Session,别什么都往上面塞。

Session对象与Cookie一样,它也是一些键值对。既然每次要传回一个ID,那如果客户端把cookie禁用了该怎么办?目前应对这种情况最经常使用的就是URL重写了。就是把Sessionid直接附加在URL路径的后面。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写。

Session生命周期

如上所述,Session在用户访问第一次访问服务器时创建,需要注意的是只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,同样的我们可以通过调用request.getSession(true)强制生成Session。那Session什么时候失效?服务器会把长时间没有活动的session从服务器内存中清除,活动是什么概念,Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。Session的超时时间可以在web.xml中设置,除此之外,直接调用Session的invalidate方法也可以使session失效。

应用场合

Cookie两个经典应用场合:判定注册用户是否已经登录网站,购物车。
Session的应用场合一般就是在Session中存储了用户的登录信息,进而可以访问一些需要权限才能访问的页面。

你可能感兴趣的:(JavaEE)