Session和Cookie
关于网络编程中的会话,维基百科是这样解释的:
在计算机科学领域来说,尤其是在网络领域,会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(例如telnet或FTP)中是非常重要的部分。
在不包含会话层(例如UDP)或者是无法长时间驻留会话层(例如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。
从这段话中可以得知,会话是用户或者客户端和服务端保持的一种“连接”。这种连接一般始于打开浏览器访问某个网址,到关闭浏览器或者关闭对于这个网站的访问。期间对于这个网站的多次请求,都属于同一个会话。比如我们在再次登录一个网站的时候,一般是不用再次输入用户名的;在访问网站期间,也不用反反复复输入密码进行验证;在购物类网站浏览时,网站可以记住我们之前添加进购物车或者浏览过的商品等,都是会话的应用范畴。
会话分为服务端的会话和客户端的会话,在服务端的会话一般采用的就是session,在客户端的会话一般采用的就是cookie。session和cookie并不是完全独立的,session往往都是依赖于cookie。
Cookie
Cookie又称“小甜饼”,是一种小型文本文件,某些网站为了辨识用户身份而存储在用户本地的数据,由网景公司在1993年3月发明。
因为HTTP协议是无状态的,服务器是不知道用户上一次做了什么操作,从安全角度来讲,对服务器的每一次请求都应该要经过权限的验证。如果采取这样的操作,应该会把用户累死。采用Cookie的机制,浏览器可以把本地的包含了服务端存储信息的Cookie发送给服务器,服务器可以从中取出所需要的信息,不用反复进行一些验证,
Cookie可分为内存Cookie和硬盘Cookie,内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。
Cookie也存在一些缺陷:
- Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
- 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS。
- Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。
java中的Cookie
Cookie由服务器创建,由键值对的方式存放内容:
Cookie cookie = new Cookie(key,value);
可以通过Cookie的源码可以看到:
public Cookie(String name, String value) {
validation.validate(name);
this.name = name;
this.value = value;
}
Cookie中常用的几个方法如下:
1.设置Cookie的值
Cookie一旦创建好了,就不能再增加别的键值对,只能修改其中的内容
public void setValue(String newValue) {
this.value = newValue;
}
2.获取Cookie的值
public String getValue() {
return this.value;
}
3.设置Cookie的有效时间
默认关闭浏览器后,Cookie就没用了,expiry单位是秒
- expiry=-1:代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了。
- expiry>0:代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器自动删除,
- expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。
public void setMaxAge(int expiry) {
this.maxAge = expiry;
}
4.设置Cookie的路径
public void setPath(String uri) {
this.path = uri;
}
当设置路径为("/")时,该域名下的所有项目都可以获取到Cookie,这时就可以实现单点登录了。
注意,Cookie不支持中文,除非采用编码上的处理。
Session
Cookie可以让服务器跟踪每个客户端的访问,但是如果每次访问都要传输这些Cookie,无形中就增加了数据传输量;而且,处于保护隐私的原因,有些用户会在禁止浏览器使用Cookie,Session的出现正是为了解决这些问题。
浏览器访问服务器时,服务器首先会检查浏览器的请求是否包含一个session标识,称为sessionID,如果服务器已经有了这个标识,代表已经为此用户创建过session,服务器就按照这个sessionID找出session使用;如果不包含sessionID,则服务器为此用户创建一个session,并把这个sessionID返回到客户端保存。此时,就可以使用cookie保存sessionID。下次访问时就可以使用这个session。
保存session的方式不仅仅是cookie一种,当用户禁用Cookie之后,还有两种方式保存Session信息:
- 基于URL PATH Parameter,默认支持
- 基于SSL,,默认不支持,只有connector.getAttribute(“SSLEnabled”)为true时才支持
java中的Session
1.获取session
javax.servlet.http.HttpServletRequest#getSession()
// 如果没有session,则创建一个session返回
javax.servlet.http.HttpServletRequest#getSession(boolean)
2.session属性操作
// 返回指定名称的对象
javax.servlet.http.HttpSession#getAttribute(String name)
// 返回保存在session中的所有信息
javax.servlet.http.HttpSession#getAttributeNames()
// 将信息以键值对的形式保存进session中
javax.servlet.http.HttpSession#setAttribute(String name, Object value)
3.销毁session
javax.servlet.http.HttpSession#invalidate()
4.设置session有效时间,单位是秒
javax.servlet.http.HttpSession#setMaxInactiveInterval(int interval)