Session & Cookie
Session
public interface HttpSession
概述
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
提供一种方法,以跨对网站的多个页面请求或访问识别用户,并存储有关该用户的信息。servlet容器使用这个接口在HTTP客户机和HTTP服务器之间创建会话。会话跨来自用户的多个连接或页面请求持续一段指定的时间。一个会话通常对应于一个用户,他可以多次访问一个站点。服务器可以通过多种方式维护会话,比如使用cookie或重写url。这个接口允许servlet来查看和操作一个会话的信息,如会话标识符、创建时间、最后访问时间对象绑定到会话,跨多个用户连接允许用户信息保存在应用程序将一个对象存储在会话或删除一个对象,对象是否实现HttpSessionBindingListener会话检查。如果它这样做了,servlet通知对象它已经与会话绑定或解除了绑定。通知在绑定方法完成后发送。对于失效或过期的会话,在会话失效或过期后发送通知。当容器在分布式容器设置中的虚拟机之间迁移会话时,将通知所有实现httpessionactivationlistener接口的会话属性。servlet应该能够处理客户端没有选择加入会话的情况,比如cookies被故意关闭。直到客户端加入会话,isNew返回true。如果客户机选择不加入会话,getSession将对每个请求返回不同的会话,isNew将始终返回true。会话信息只作用于当前web应用程序(ServletContext),因此存储在一个上下文中的信息在另一个上下文中不会直接可见。
特点
1、不是线程安全的,应该避免多个线程共享同一个Session实例;
2、Session实例是轻量级的,所谓轻量级:是指他的创建和删除不需要消耗太多资源;
3、Session对象内部有一个缓存,被称为Hibernate第一缓存,他存放被当前工作单元中加载的对象,每个Session实例都有自己的缓存。
原理
服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。
常用方法
Object getAttribute(字符串名称)
返回此会话中使用指定名称绑定的对象,如果该名称下没有绑定对象,则返回null。
String getId ()
返回一个字符串,其中包含分配给这个会话的唯一标识符。
int getMaxInactiveInterval ()
返回servlet容器在客户机访问之间保持会话打开的最大时间间隔(以秒为单位)。
ServletContext getServletContext ()
返回此会话所属的ServletContext。
void invalidate ()
使该会话无效,然后解除绑定到它的任何对象。
boolean isNew ()
如果客户端还不知道会话,或者客户端选择不加入会话,则返回true。
void setAttribute(字符串名称,对象值)
使用指定的名称将对象绑定到此会话。
void setMaxInactiveInterval (int间隔)
指定在servlet容器使该会话失效之前客户机请求之间的时间(以秒为单位)。
浏览器禁用Cookie后的session处理
URL重写:
response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
**response.encodeURL(java.lang.String url)**用于对表单action和超链接的url地址进行重写
所以,当浏览器禁用了cookie后,就可以用URL重写这种解决方案解决Session数据共享问题。而且response. encodeRedirectURL(java.lang.String url) 和response. encodeURL(java.lang.String url)是两个非常智能的方法,当检测到浏览器没有禁用cookie时,那么就不进行URL重写了。
Cookie
public class Cookie extends Object implements Cloneable, Serializable
概述
一个小信息,由服务器写给浏览器的。由浏览器来保存。
原理
创建cookie,由servlet发送到Web浏览器的少量信息,由浏览器保存,然后发送回服务器。cookie的值可以唯一地标识客户端,因此cookie通常用于会话管理。
常用方法
int getMaxAge ()
获取此Cookie的最大时间(以秒为单位)。
String getName ()
返回cookie的名称。
String getPath ()
返回浏览器将此cookie返回到的服务器路径。
String getValue ()
获取此Cookie的当前值。
void setValue(字符串newValue)
将一个新值赋给此Cookie。
voidsetMaxAge (int到期)
以秒为单位设置此Cookie的最大时间。
voidsetPath uri(字符串)
指定cookie的路径,客户端应该将cookie返回到该路径。
区别
Cookie是客户端技术,通常保存在客户端,即本地,IE浏览器把Cookie信息保存在类似于C:\windows\cookies的目录下。因为Cookie在客户端所以可以编辑伪造,不是十分安全
Session是服务器端技术,在服务端,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务
Cookie 只能存储 String 类型的对象
Session能够存储任意的 java 对象
Cookie存在客户端对服务器没影响
Session过多时会消耗服务器资源,大型网站会有专门Session服务器
Cookie通过设置指定作用域只能在指定作用域有效
Session在整个网页都有效
Cookie可以通过 setMaxAge设置有效时间,即使浏览器关闭了仍然存在 关闭网页Session就结束了
\1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
\2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
\3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。
所以,总结一下:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。