会话技术:
会话:双方的交流或者交互,计算机中也是,浏览器和服务器的交互称之为会话
会话的生命周期:
开始:
浏览器访问服务器时会话开始
结束:
浏览器或者服务器一方中断时,会话结束
由于服务器一般一直处于持续运行状态,会话结束一般是浏览器关闭引起的
会话技术:交互过程中的数据存储技术
会话中会产生一些数据,比如:注册页面客户录入的数据,访问服务器的时间,后台生成的验证码...
数据怎么存储:
A、最常见方案 ---- 数据库存储
B、将数据存储到 Cookie ---- 数据由浏览器保存
C、将数据存储到 session --- 数据由服务器保存 (和数据库的区别,没有实现持久化存储)
Cookie
浏览器中的存储形式为:
站点(服务器硬件)项目(服务器所在程序)路径(具体的servlet)
创建Cookie并发送到浏览器:
Cookie c = new Cookie("键","值");
response.addCookie(c); //没有设置路径Cookie的路径就是Servlet路径
底层封装:
响应头:set-cookie 键=值
浏览器进行保存:
选项 ----> 隐私 ----> cookie 查看
浏览器将Cookie携带到服务器:
将Cookie存储到请求头
键:cookie
值:不同的Cookie使用";"隔开
Cookie使用:
A、键重名时,后面的 Cookie 会覆盖前面的(当前阶段:Cookie 不能重名)
B、获取 Cookie 的键和值
getName() getValue()
C、Cookie的存活时间
Cookie 默认存活至浏览器关闭 ----- Cookie 只在内存中
setMaxAge(时间值秒数) --- 可以设置 Cookie的存活时间 ---- 浏览器关闭时,会将 Cookie 序列化到磁盘文件
注意:
1、Cookie 怎么删除?
可以调用 setMaxAge(0)
2、setMaxAge(负数) --- 和不设置一样,存活到会话结束
Cookie的重名存储
A:调用setPath实现,相同名称的Cookie如果path不同,那么可以重名存在
Cookie.setPath("/day3701demo_cookie/a/b")
必须要指定这个路径才能获取到当前的这个Cookie,同时也能获得父级的目录
B:站点不同时,Cookie也可以重名
Servlet路径与Cookie获取
A:和Servlet同级的Cookie可以获取
B:父级下面的Cookie也可以获取到
Cookie的中文键值:
创建:Cookie c = new Cookie(URLEncoder.encode("中","UTF-8"),URLEncoder.encode("国","UTF-8"));
获取:键:URLDecoder.decode(c1.getName(),"UTF-8")
值:URLDecoder.decode(c1.getValue(),"UTF-8")
Cookie的限制:
1、在浏览器中一个Cookie存储的数据不超过 4kb
2、浏览器针对于一个服务器,最多支持 20 个cookie
3、浏览器最多就支持 300 个Cookie
Session:
1、Session 使用流程
A、第一次访问 Servlet ,调用 getSession 方法,这时会创建一个 Session 对象 ----- getSession --- 创建
并生成一个 cookie,cookie 和 session 是关联的(有相同的ID)(此时的Cookie被隐藏)
B、JSESSIONID 被发送到浏览器,浏览器保存
C、再次访问时,取出JSESSIONID 传递到服务器
D、服务器解析查找 对应的Session ---- getSession --- 获取已经存在的
E、使用 Session
2、session特点:
A、session 可以实现不同Servlet之间数据的共享
B、session 通过 Cookie 的ID 进行查找 cookie 的值刚好和 Session 对象的ID值一样
session和ServletContext比较:
ServletContext 不光在 Servlet 之间可以共享,对于每一个会话也是共享的
session 在 servlet 之间共享,但是每一个会话都有自己的一个session
3、session 使用语法
A、获取Session ---- request.getSession()
B、设置值 ---------- session.setAttribute("键",Object类型);
获取值 ------------ session.getAttribute("键")
删除 --------------session.removeAttribute("键");
4、session 的生命周期
A、创建
第一次调用 getSession() 创建
getSession() ---- 第一次访问创建
getSession(true) - 第一次访问创建
getSession(false)- 第一次访问不会创建对象,得到null
B、使用
C、消亡
1、强制 Session 消亡 --- 调用invalidate() 方法
2、使用Tomcat 默认实现让 session 自然消亡 ----- 浏览器超过 30分钟不使用 session ,那么tomcat 会干掉 session
3、关闭服务器时,序列化 session ----- 正常关闭(客户端没有关闭)
非正常关闭:session 不能序列化,丢失了(序列化之后重新开启服务器此次会话的数据继续使用,丢失了重新设置)
5、session注意事项
1、注意浏览器关闭时,一次会话结束,那么JSESSIONID 释放,这次会话对应的 Session ,下次访问不能获取到
2、服务器的session 超过默认的30分钟,就可以销毁了
作用域:
ServletContext ---- 全局有效(不同的客户端访问的是同一个)
session ----------- 不同servlet之间(不同的客户端访问会产生不同的session),一次会话中只有一个session
request ----------- 只是在本次请求有效
Session 和 Cookie
1、存储位置不同
2、存储的数据不同 cookie 字符串, session Object类型
3、存储个数不同
4、cookie 不安全,以文件方式存储在浏览器的对应的磁盘上
5、cookie 和 session 比较 session 加大服务器端的压力,cookie 不存在这个问题
6、浏览器禁用Cookie,session 必须结合URL重写