一、基础概念理解
1、无状态Http协议:
协议是计算机通信网络中两台计算机之间进行通信必须共同遵守的规则,超文本传输协议(Http)是计算机网络通信的一种常见协议;Http协议是一种无状态的协议,一旦数据交换完成,客户端与服务端的连接就会关闭,再次交换数据需要建立新的连接,服务器将无法跟踪会话。
2、会话(Session)跟踪:
会话是指用于登录网站后的一系列动作,例如添加商品到购物车。会话(Session)跟踪是web程序中常用的技术, 用于跟踪用户的整个会话。常见的会话技术是Cookie和Session,Cookie通过客户端记录信息确定用户身份,主要存贮于客户端硬盘上;Session通过在服务器记录信息确定用户身份,存储于服务器上。
二、Cookie机制
2.1、何为Cookie
Cookie实际上就是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端游览器颁发一个cookie。客户端游览器接受到cookie后会它保存起来,当游览器再次请求该网站时,游览器把请求的网址连同Cookie一同交给服务器,服务器检查Cookie以此判定用户的状态。
2.2、Unicode编码
中文属于Unicode字符,在内存中占据了4个字符;英文属于ASII字符,占据了2个字符;Cookie中使用Unicode字符时需要对Unicode字符进行编码,Cookie中保存中文主要使用UTF-8码表进行编码,不推荐使用GBK编码。
2.3、Cookie所有属性和用法
(1)属性表:
属性名 | 作用 | 取值规范 |
name | Cookie的名称 | Cookie一旦创建,名称即不可修改 |
value | 该Cookie的值 | 如果值为Unicode字符,则需要为字符使UTF-8编码 |
maxAge | Cookie失效时间 | 1、为正数,则该Cookie在大于maxAge秒后失效,默认值为-1; 2、为负数,关闭游览器时失效,游览器不会以任何形式保存该Cookie; 3、为0,表示删除该Cookie,Cookie机制没有提供删除Cookie的方法,因此设置Cookie的即时失效来达到删除效果,失效的Cookie将会被游览器从Cookie文件中删除; 4、值为Integer.MAX_VALUE,则其使用时间为永久。 |
path | Cookie的使用路径 | 默认为“/”,即本域名下contextPath均可以访问该Cookie |
domain | 可以访问该Cookie的域名 | 如设置“baidu.com”,则所有已baidu.com结尾的域名均可访问该Cookie |
secure | 该Cookie是否被使用安全协议 | 在网络上传输数据之前是否先将数据加密,默认为false |
(2)常见用法及方法:
方法/用法 | 描述/作用 |
Cookie cookie=new Cookie(name,value); | 创建一个Cookie实例并初始化 |
response.addCookie(cookie); | 响应流中添加该cookie |
setPath(url) | 设置cookie使用路径 |
setDomain(string) | 设置访问域名 |
setMaxAge | 设置最大有效时间 |
2.4、Cookie的修改和删除
申明:Cookie没有具体的修改和删除的方法,所以cookie的删除和修改只能新建一个同名的Cookie替代原先的Cookie;
修改Cookie:创建一个同名的Cookie,用response的addCookie方法将新建的Cookie添加到响应流中覆盖原来的旧Cookie;
删除Cookie:创建一个同名Cookie,并将maxAge的值设置为0,添加到response中覆盖原来的cookie中。
Cookie cookie = new Cookie("username","helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(0); // 设置生命周期为0,不能为负数
response.addCookie(cookie); // 必须执行这一句
2.5、Cookie的域名
Cookie 是不可跨域的,这是有cookie的隐私安全机制决定的,正常情况下同一域名下的两个子域名也不能交互使用cookie,如“baidu.com”的子域名“www.baidu.com”和“img.baidu.com”不能交换使用Cookie,如要想都可以使用Cookie,需要设置Cookie的domain参数,代码如下:
Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setDomain(".baidu.com");
PS:domino默认的值为请求的地址
2.6、Cookie的路径
path属性决定允许访问Cookie的路径(ContextPath),如果同一服务器有如下目录:/test/、/test/cd/、/test/dd/;现在设置cookie1 的path值为‘/test/’,cookie2的path为'/test/cd/',那么test下面的所有页面均能访问到cookie1,但/test/与/test/dd/下的子页面不能访问cookie2,这是因为cookie能让其path路径下的页面访问。
三、Session机制
3.1、何为Session
Session是另外一种记录客户状态的机制,信息存贮于服务端;客户端访问游览器时,服务器把客户端信息以某种形式记录在服务器上可跨域请求访问,多个servlet可共享一个session,这就是Session。
3.2、Session常用方法
方法 | 作用 |
req.getSession() 或者 req.getSession(true) | 创建一个新的Session对象 |
req.getSesssion(false) | 获取已创建了的Session对象 |
session.setAttribute(name,value) | 设置session的域属性 |
session.getAttribute(name) | 获取session域属性的值 |
invalidate() | 使session失效 |
getLastAccessedTime() | 获取session最后活跃/访问的时间 |
getMaxInactiveInterval() | 获取session的超时时间,Tomcat中默认的超时时间是20分钟。 |
3.3、Session生命周期
因为Session存放于内存中,session太多会导致内存溢出问题,为了解决这个问题就引入了生命周期;Session生成后只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。无论是否读写了Session,服务器都认为该用户的Session活跃了一次。
内存溢出的解决:为防止内存溢出,服务器会将长时间不活跃的session从内存中删除;如果用户超过MaxInactiveInterval
超时时间未访问服务器,Session就会自动失效,超时时间的默认值是20分钟。下面我们介绍一下两种设置最大超时时间的方法:
(1)通过setMaxInactiveInterval(int seconds)修改超时时间,单位为秒;
(2)修改web.xml改变Session的默认超时时间,比如修改为60分钟;
<session-config>
<session-timeout>60</session-timeout> <!-- 单位:分钟 -->
</session-config>
3.4、Session工作原理
(1)创建session成功后,服务器会自动生成一个Map用于存放Session对象,其中Map的key是session地址(一套算法生成)即“JSESessionID”,Map的Value对应的是当前session的引用,即Session对象;
(2)将session信息写入session列表后,系统会自动将“JSESessionID”的值存入set-cookie中,然后通过响应头将set-cookie传递到客户端并存储在客户端;
(3)客户端再次发起请求时将(2)中获取的set-cookie发送给服务端;
(4)服务端将接受到的set-cookie解析然后从Map中找到相应的session。
四、Cookie和Session的区别
1、cookie数存放在浏览器硬盘上,session数据放在服务器内存上;
2、cookie不安全,容易被黑客分析并进行cookie欺骗,考虑安全性应使用session;
3、session会在一定的时间内保存在服务器上,当访问增多时会占用较多的服务器性能;
4、cookie与session虽然有区别,但是session依赖于cookie,如果浏览器禁用cookie则session也不能正常使用。