cookie和session是常用的会话跟踪技术
cookie机制
1、web应用程序是使用HTTP协议传输数据的,HTTP协议是无状态的协议,一旦数据交换完毕就会关闭链接。Cookie可以弥补HTTP协议无状态的不足。
位于:javax.servlet.http.Cookie
2、Cookie具有不可跨域名性。Cookie的管理是浏览器,浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。例:images.baidu.com与www.baidu.com不是同一个域名,cookie不能相互操作。但可以对此类cookie做特殊处理,让其相互访问。
3、Unicode编码:保存中文
中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要URLEncode编码,否则乱码。一般采用UTF-8即可,GBK不推荐使用,因为浏览器不一定支持,而javascript也不支持GBK。
4、BASE64编码:保存二进制图片
Cookie可以使用二进制数据。例如在Cookie中使用数字证书,提供安全度。使用二进制数据时需要编码BASE64。
BASE64:sun.misc.BASE64Encode;sun.misc.BASE64Decoder;
byte[] binary = new byte[1024];
String content = BASE64Encode.class.newInstance().encode(binary);
5、Cookie的属性
6、Cookie的有效期
cookie.setMaxAge(秒)
负数:为临时性Cookie,不会被持久化,不会写到cookie文件中,cookie信息保存在浏览器内存中,关闭浏览器cookie就会消失,cookie的默认值为-1。
0:为零表示删除该cookie,会从浏览器内存中删除。
maxAge属性只是被浏览器判断是否过期的,不会提交到服务端。
修改:新建一个同名的cookie,覆盖原来的cookie。
删除:新建同名的cookie,并将maxAge为零,进行覆盖。
7、永久登录
方案:在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到cookie中。下次访问时只需要判断账号的加密规则是否正确即可。如:把账号连同密匙用MD5算法加密后保存到cookie中,验证时,验证cookie中的账号与密匙是否与cookie中的一样。
session机制
session对应类javax.servlet.http.HttpSession类
session的使用比cookie方便,但过多的session存储在服务器内存中,会对服务器造成压力。
session的生命周期:
session在用户第一次访问服务器的时候自动创建,需要注意只有访问JSP,Servlet等程序时才会创建session,访问html等静态资源并不会创建session。如果未生成session,可以使用request.getSession(true)强制生成。session生成后,只要用户继续访问,服务器就会更新session的最后时间,并维护session。用户每访问服务器一次,无论是否读写session,服务器都认为该用户的session活跃了一次。
session的有效期:
越来越多的用户访问,session也会越多,为防止内存溢出,服务器会把长时间内没有活跃的session从内存中删除。超时时间属性为maxInactiveInterval,可设置超时时间。
tomcat的默认超时时间是20分钟。
web.xml也可以设置超时时间
<session-config>
<session-timeout>60</session-timeout > <!—单位:分钟à
</session-config>
session对浏览器的要求:
http协议是无状态的,不能依据http连接来判断是否同一客户,因此服务器向客户发送一个名为JSESSIONID的cookie,它的值为session的id,session依据该cookie来识别是否为同一用户。该cookie为服务器自动生成,他的maxAge属性为-1,表示仅当前浏览器内有效。
如果客户端浏览器将cookie功能禁止,或者不支持cookie,例如大多数手机浏览器都不支持cookie,Javaweb提供另一种方案:URL地址重写。
URL地址重写:
原理是将该用户session的id信息重新写到URL地址中。
参考http://book.51cto.com/art/200912/169770.htm