1.会话&cookie机制1.1:会话(Session)
会话(Session)跟踪是Web程序里我们常用的技术,作用是用来跟踪用户的整个会话。而我们常用的会话跟踪技术是cookie与Session。cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
1.2:cookie机制常理而言,一个用户的所有请求操作本应都该属于同一个会话,另一个用户的所有请求操作应该属于另一个会话,但Web程序是使用HTTP协议(无状态协议)来传输数据的,两者数据一旦交换完成,客户端和服务端将会断开连接,再次交换数据则需建立新的连接,因此服务器无法从连接上跟踪会话。
例:张三在超市拿了一瓶牛奶放入至购物车中,然后又拿了一个面包,这时服务器将无法判断后拿的面包是属于张三的会话还是李四的会话。
2.什么是cookie?
cookie原意为“甜饼”,但实则并不是该意思,而是保存在客户机中的一段不超过4KB的“小型文本文件(可理解为给客户端颁发的通行证,通过该证即可确认客户的身份)”,是某些网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地机上的数据,由客户端计算机暂时或永久保存的信息。由W3C组织提出,保存在客户端浏览器中。
2.1:cookie的所有属性| 属性名 | 描述 |
| String name | 名称:一旦创建,便不可更改。 |
| Object value | 值:若值为Unicode字符,则需要为字符编码;若值为二进制数据,则需要使用base64编码。 |
| int maxAge | 失效的时间(单位秒):如果是正数,则该cookie在maxAge秒之后失效。如果为负数,该cookie为临时cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该cookie。如果为0,表示删除该cookie。默认为–1 |
| boolean secure | 该cookie是否仅被使用安全协议传输:安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false |
| String path | 使用路径:如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该cookie。如果设置为“/”,则本域名下contextPath都可以访问该cookie。注意最后一个字符必须为“/” |
| String domain | 可访问该cookie域名:如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该cookie。注意第一个字符必须为“.” |
| String comment | cookie的用处说明:浏览器显示cookie信息的时候显示该说明 |
| int version | cookie使用的版本号:0表示遵循Netscape的cookie规范,1表示遵循W3C的RFC 2109规范 |
如果maxAge属性为正数,那么cookie将会在maxAge秒后自动失效,只要还在maxAge前,无论用户关闭浏览器还是关机登录网站时的cookie依旧有效。
如果maxAge为负数,则不会被持久化,cookie信息保存在浏览器内存中,这时若是关闭浏览器该cookie将会消失,cookie默认的maxAge值为–1。
cookie cookie = new cookie("name","value"); // 新建cookie
//maxAge属性为正数,以下代码将永久有效
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE
//maxAge为负数
cookie.setMaxAge(0); // 设置生命周期为0,则表示删除该cookie,不能为负数
cookie.setDomain(".helloweenvsfei.com"); // 设置域名
cookie.setPath("/session/"); // 设置路径
cookie.setSecure(true); // 设置安全属性
response.addcookie(cookie); // 必须执行这一句(输出到客户端)
3.什么是Session?
Session是另一种记录客户状态的机制,即用户浏览器访问服务器时,服务器把用户的信息以某种形式保存在服务器上,且增加了服务器的存储压力。Session机制决定了当前客户只会获取到自己的Session,
3.1:Session的常用方法| 方 法 名 | 描 述 |
| void setAttribute(String attribute, Object value) | 设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大 |
| String getAttribute(String attribute) | 返回Session属性 |
| Enumeration getAttributeNames() | 返回Session中存在的属性名 |
| void removeAttribute(String attribute) | 移除Session属性 |
| String getId() | 返回Session的ID。该ID由服务器自动创建,不会重复 |
| long getCreationTime() | 返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime()) |
| long getLastAccessedTime() | 返回Session的最后活跃时间。返回类型为long |
| int getMaxInactiveInterval() | 返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效 |
| void setMaxInactiveInterval(int second) | 设置Session的超时时间。单位为秒 |
| void putValue(String attribute, Object value) | 不推荐的方法。已经被setAttribute(String attribute, Object Value)替代 |
| Object getValue(String attribute) | 不被推荐的方法。已经被getAttribute(String attr)替代 |
| boolean isNew() | 返回该Session是否是新创建的 |
| void invalidate() | 使该Session失效 |
因访问服务器的用户越来越多,然而Session也会随之增多,为了防止内存溢出,服务器会把长时间(Session超时时间,若超时没访问该服务器,Session将自动失效)不活跃的Session从内存中移除。
Tomcat中Session的默认超时时间为20分钟,通过setMaxInactiveInterval(int seconds)修改超时时间,也可修改web.xml改变Session的默认超时时间
//设置Session超时时间60
4.cookie和session的区别?
cookie数据存放在客户的浏览器上,Session数据放在服务器上.cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用Session。设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。Session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)一个是IE启动到IE关闭.(浏览器页面一关 ,Session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie) 注:
Session很容易失效,用户体验很差;
虽然cookie不安全,但可以加密 ;
cookie也分为永久和暂时存在的;
浏览器有禁止cookie功能 ,但一般用户都不会设置;
一定要设置失效时间,要不然浏览器关闭就消失了;



