浏览器输入地址--HTTP请求--Servlet--HTTP响应--浏览器接收浏览器
会话(session):打开浏览器,打开一系列页面,关闭浏览器安全
使用场景:服务器
网购网站的偏好记录cookie
网站的自动登陆session
浏览记录,如欢迎标语“xxx再次回来”并发
原理:客户端/服务器端保存会话数据:Cookie(浏览器端)/Session(服务器端)post
Cookie:测试
为了辨别用于身份而储存在用户终端的key-value数据网站
工做流程:ui
浏览器发出HTTP请求
服务器根据须要生成Cookie对象并把相关数据保存在该对象中
将Cookie对象放在HTTP响应头中一并发送给浏览器
浏览器接收到响应后,提出该Cookie并保存;
浏览器第二次访问该服务器时
将Cookie放在请求头中一并发送给服务器
服务器从请求头中提取该Cookie对象读取数据作出个性化的响应
Cookie的生命周期:
默认为 会话结束后失效 -- 称为会话Cookie,通常保存在内存中
setMaxAge设置有效期,保存在硬盘中
Cookie的缺陷:
大小和数量的限制:通常为每一个站点保存最多20个Cookie,每一个Cookie在4k之内
数据安全性问题:HTTP请求中的Cookie是明文传递的
Cookie:
case:登录
登录页面 form post获取userName和userPassword到user/specify
在user/specify的Servlet中:process() 中
String userName=request.getParameter("userName");
String userPassword=request.getParameter("userPassword");
// 建立Cookie Cookie userNameCookie = new Cookie("userName", userName); Cookie passwordCookie = new Cookie("password", userPassword); // 将Cookie放入对应的响应体中 response.addCookie(userNameCookie); response.addCookie(passwordCookie); // 设置过时时间 userNameCookie.setMaxAge(2 * 60); // unit minute passwordCookie.setMaxAge(2 * 60);
第二次登录时读取cookie:
Cookie[] cookies = request.getCookies(); if(cookies != null) { for(Cookie cookie: cookies) { if(cookie.getName().equals("userName")) { userName = cookie.getValue(); } if(cookie.getName().equals("userPassword") { userPassword = cookie.getValue(); } } }
第二次登录页面时,打开developer tools--Application--cookies可见详情
Session:
HTTPSession服务器端为客户端建立的对象,用于保存客户端的状态数据
工做原理:
浏览器端发送HTTP请求到服务器端
服务器端根据请求需求生成一个Session对象,并给该对象附上惟一编号和对应数据
服务器端将Session对象的惟一编号放到Cookie对象中
服务器将HTTP响应返回给浏览器端
浏览器再次发送请求到该服务器时
服务器收到带有Seesion id的Cookie以后,取出Session id,找到对应Session对象
辨别出对应用户后,对用户进行个性化的响应
Session生命周期
默认有效期30分钟
setMaxInactiveInterval设置有效期(单位:秒)
部署描述符配置有效期(单位:分钟)
<session-config> <session-timeout>2</session-timeout> </session-config>
invalidate使Session失效
--优先级:接口 > 部署描述符
case:登录(在上例Cookie的基础上)
// 建立HTTPSession对象 HttpSession session = request.getSession(); // 无Session时默认建立新的Session对象
String name = (String) session.getAttribute("userName");
session.setMaxInactiveInterval(2 * 60); // expire time (seconds)
session.invalidate(); // invalidate the session
// 再次请求时
if (name != null) {
syso("second login: " + name);
}
// 将数据放入Session对象
session.setAttribute("userName", userName);
在Chrome--developer tools--Application--Cookies--能够看到JSESSIONID
总结:
数据存储:Cookie存在于客户端;Session存在于服务器端
安全性:Cookie在客户端明文传递;Session存在于服务器端的内存中,安全性较强
生命周期:到时间失效;Cookie时间设置为第一次访问开始算起;Session时间设置为从最后一次访问开始算起,Session可主动让其失效
使用原则:Cookie有数量(20)、大小(4k)限制;Session存在于内存,建议大小不要太大
下面哪一种场景没有使用会话技术?
下面哪项关于Cookie与Session的生命周期说法是错误的?
下面哪项说法是错误的?
下面哪项对Session的说法是错误的?
下面哪项说法是正确的?
Cookie是保存在客户端,Session是保存在服务端
相对而言,Cookie比Session安全性更高
Cookie是一直会保存在客户端浏览器中
Session有默认的有效期,有效期过了Session数据会失效