常用的会话跟踪技术
HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题。不然有些情况下即使是同一个网站每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。
cookie | session | |
---|---|---|
存在于 | 存储数据在客户端(不安全) | 存储数据在服务器 |
存储数据 | 存储数据有限(4kb),且cookie只能存储字符串 类型的对象 | 数据大小不受限制 ,可存储任意的 java 对象 |
数量限制 | 一个网站可以存 20个 cookie | 没有限制 |
性能 | Cookie存在客户端对服务器没影响 | Session过多时会消耗服务器资源,大型网站会有专门Session服务器 |
失效时间 | 暂时性cookie:存储到浏览器缓存中(浏览器关闭时失效),永久性cookie :可设置时间 setMaxAge() 时间单位是秒 cookie.setMaxAge(0); //0表示当前的cookie失效 | 设置失效时间:以最后一次操作时间起算 setMaxInactiveInterval(1800);//秒 ,invalidate();//无条件让session失效 |
1. cookie:
- 存储数据在客户端(key-value)
通过服务器的程序Servlet把cookie对象存到客户端 - 不安全,存储数据有限:4kb
- 一个网站可以存 20个 cookie
1.1 设置cookie
- cookie存的数据只能是字符串
- new Cookie(key,value)
- 存中文:要编码和解码,否则会乱码
- 编码:URLDecoder.decode(“value”,“UTF-8”);
- 解码:URLEncoder.encode(“value”,“UTF-8”);
- response.addCookie(cookie);
设置永久性cookie:
1.2 获取cookie
- request.getCookies();
- cookie.getName()
- cookie.getValue()
1.3 cookie失效
- 暂时性 cookie:存储到浏览器缓存中。浏览器关闭时失效
- 永久性 cookie :可设置时间 setMaxAge()
* cookie.setMaxAge(1800);// 时间单位是秒
* cookie.setMaxAge(0); //0表示当前的cookie失效
练习:免登录功能
LoginServlet:
login.jsp
ok.jsp
2. session
request | session | application | |
---|---|---|---|
生命周期 | 一次请求响应 | 一次会话 | 和web应用生存周期相同 |
- 存储数据在服务器
- 数据大小不受限制
- 服务器和客户端连续的会话(请求响应)过程
- 需要管理数据(会话管理)。
- HTTPSession没有父接口
2.1 获取session对象
- request.getSession()
- request.getSession(boolean)
- request.getSession(true)
第一次调用此方法,表示创建一个session对象,
之后再去调用此方法,表示获取之前创建的对象
getSession()和 getSession(true)形同 - request.getSession(false)
如果之前创建过session对象,则返回session对象,如果没有,那么返回null(不创建对象)
- request.getSession(true)
2.2 session常用方法
- isNew() // 返回true,是新创建的对象
- getId());//sessionid
- getMaxInactiveInterval()); //session最长有效时间
- getCreationTime()); // 创建session的时间
- getLastAccessedTime())); // 最后访问时间
2.3 存储数据
- setAttribute
- getAttribute
- removeAttribute
2.4 session失效
- 默认(分钟)
< session-config>
< session-timeout> 30 < /session-timeout>
< /session-config> - 设置失效时间
以最后一次操作时间起算- session.setMaxInactiveInterval(1800);//秒
- session.invalidate();//无条件让session失效
2.5 工作原理
- 第一次创建session对象时,会产生唯一的id,以cookie对象的方式响应到客户端
(id作为cookie对象的value,JSESSIONID作为key,封装成cookie对象,new Cookie(“ISESSIONID”,session.getId())) - 默认放在浏览器的缓存中,作为客户端header信息的一部分,以request header的形式存起来。
- 再通过该浏览器发送请求时,request header把请求发送给服务器端;
- 根据JSESSIONID,找到session对象,如果有,返回,如果没有,创建一个新的session对象。