Web会话跟踪(cookie与session)
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。
cookie
定义
cookie是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
类型
-
内存式Cookie
内存式Cookie存储在内存中,浏览器关闭后就会消失,由于其存储时间较短,因此也被称为非持久Cookie或会话Cookie。
-
硬盘式Cookie
硬盘式Cookie保存在硬盘中,其不会随浏览器的关闭而消失,除非用户手工清理或到了过期时间。由于硬盘式Cookie存储时间是长期的,因此也被称为持久Cookie。
工作原理
图示
- Cookie定义了一些HTTP请求头和HTTP响应头,通过这些HTTP头信息使服务器可以与客户进行状态交互。
- 客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。
- 再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。
使用方法
-
ava中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。
-
通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回)
-
通过response.addCookie(Cookiecookie)向客户端设置Cookie。
-
Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。
-
//新建Cookie Cookie cookie = new Cookie("username","helloweenvsfei"); //设置生命周期为MAX_VALUE cookie.setMaxAge(Integer.MAX_VALUE); //输出到客户端 response.addCookie(cookie);
注意:因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。
常用属性
private static final CookieNameValidator validation;
private static final long serialVersionUID = 1L;
//Cookie的名称
private final String name;
//Cookie的值
private String value;
//该Cookie的版本号
private int version = 0;
//用处说明
private String comment;
//可以访问该Cookie的域名.
private String domain;
//Cookie的失效时间,时间秒,默认为-1,如果为0,则表示删除该Cookie
private int maxAge = -1;
//Cookie的使用路径
private String path;
//是否仅被使用安全协议传输
private boolean secure;
private boolean httpOnly;
session
定义
客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
注意
- Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
- 如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
- 当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。
- 只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。
工作原理
session id保存
-
使用Cookie进行保存
-
保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。
-
然而,比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。
-
-
URL重写
- 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。
- 类型
- 附加方式也有两种,一种是作为URL路径的附加信息
- http://…/xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
- 另一种是作为查询字符串附加在URL后面
- http://…/xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
- 附加方式也有两种,一种是作为URL路径的附加信息
- 注意
- TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。
-
表单隐藏字段
- 表单隐藏就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。
使用方法
- Session对应的类为javax.servlet.http.HttpSession类。
- 每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。
- Session对象是在客户端第一次请求服务器的时候创建的。
- Session也是一种key-value的属性对,通过getAttribute(String key)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session,
// 获取Session对象
HttpSession session = request.getSession();
// 设置Session中的属性
session.setAttribute("loginTime", new Date());
// 获取Session属性
System.out.println("登录时间为:" +(Date)session.getAttribute("loginTime"));
常用方法
cookie和session的区别
- cookie数据存放在客户端,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
- session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用cookie。
- 不同浏览器对cookie的数据大小限制不同,个数限制也不相同。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
- 可以考虑将登陆信息等重要信息存放为session,不重要的信息可以放在cookie中。
cookie和session的联系
- 都是用来记录用户的信息,以便让服务器分辨不同的用户。
- 可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。