cookie的发送
1.创建Cookie对象
2.设置最大时效如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中(服务器自动创建一个cookie并将jsessionId作为key,sessionId的值作为value发送到客户端浏览器内存中),用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而非setCookie。
>>>>>响应报头必须在任何文档内容发送到客户端之前设置。
***************************************************************************
会话cookie和持久cookie
如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。
如果设置了过期时间(setMaxAge(60*60*24)),浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。
*****************************************************************************
cookie机制和session机制的区别
Cookie是客户端的存储空间,由浏览器来维持。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识(jsessionid),所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择,比如说重写URL(链接后面跟上jsessionid参数)和隐藏表单域。
《对session和cookie的一些理解》,这篇文章介绍的还是挺详细,可以参考下
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
当然这并不是本文的重点。
由于http协议本身是无状态的,为了连接上下文的请求,需要记录一些基本信息,比如登陆成功后,会将用户信息存入session中,下一次http请求时,首先会查看session,如果有值,则认为是登陆过;否则跳到登陆页面。session对象通常保存在内存里。
当面对高并发,高访问量时,为了提高系统的扩展性,我们会使用集群,将一个app应用部署到N台服务器中,这些对用户来讲是透明的,集群的作用相当于一台“超级服务器”。 这种策略固然很好,有效分摊了流量,但是如何保证前后两次请求拿到的session信息一致呢?
1. 每台服务器都备份一份session信息,服务器之间保持同步,当session的值改变时,会复制到其它的机器上。但是随着机器的增加,网络的负担会很重,可扩展性较差。
2. 将session保存在单一数据源中,被所有的集群共享。这种方案缺少应用服务厂商的支持,很少有应用服务器直接支持这种方案。另外,一旦数据源崩溃,所有的应用都不能提供正常服务。
3. 将session信息保存客户端,也就是cookie中,采用时间换空间的方式,每次都要解析cookie数据到session中,从而来确定用户是否登陆,这对于当代高性能服务器来讲完全不是什么问题;另外由于受到cookie的一些标准限制,所以一些细节需要特别注意/
>>由于各浏览器支持的cookie的标准不一致,通常会选择最低标准,每个domain下最多20个,每个cookie的长度不能超过4K
>>安全性。一旦cookie被人拦截,拦截者并不需要对其解密,知道其真实含义,只要原样转发即可达到目地
>>另外也有一些信息不会存于cookie中,比如统计一个页面提交的频率或防止重复提交表单等,我们会在server端保存一个计数器
尽管有这些缺点,但是相比其优点来讲,这些都是浮云。
>>在底层框架中,HttpservletResponse写入cookie时,要控制其个数、大小
>>尽管拦截者原样转发cookie一样可以达到目地,我们仍然要对重要cookie字段加密
>>cookie中尽量不要存一些重要信息,比如密码等,这样即使被盗也不会造成重大损失
>>cookie字段尽量加上生命周期,小偷拿到过期cookie的可能性上升,降低风险