会话技术
会话技术: 为了解决浏览器和服务器数据共享的问题
会话: 就是浏览器和服务器建立的一次连接,在这次连接中,可以包含多次请求和响应,并且再多次请求和响应之间进行数据的共享
客户端会话技术
数据由客户端保存,Cookie
原理:
1.客户端请求一个资源,服务器做出响应时,会发送set-cookie头,共享数据
2.客户端接收到响应,会将数据保存在客户端浏览器中
3.客户端再一次请求服务器时,会通过cookie头携带该数据。
4.服务端接收到请求,会来解析获取数据
服务端会话技术
数据由服务端保存,Session
原理:
session依赖于cookie存在
当浏览器请求时,服务器会给这个Session对象生成一个唯一编号,叫jsessionid,然后通过set-cookie响应头,让浏览器带回去保存,当浏览器下一次再来请求时,通过cookie请求头把jsessionid带回来,服务器通过jsessionid找到原来那个session对象,然后取出session中的数据
客户端Cookie
Java实现cookie:
发送Cookie:
Cookie cookie = new Cookie("MilkTeaShop","card");
cookie.setMaxAge(60*60*24*3);
response.addCookie(cooike);
接收Cookie:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("MilkTeaShop".equals(name)) {
String value = cookie.getValue();
System.out.println(value);
}
}
}
注意事项:
1.持久化
默认Cookie是存在浏览器的内存中,也就是说浏览器一关闭就请空掉,这就是Cookie的持久化问题,可以让Cookie存储到磁盘上,进行设置,让Cookie保存到磁盘上,设置Cookie的存活时间
setMaxAge(int second);
cookie.setMaxAge(60*60*24*3);
2.Cookie存储中文
Tomcat8.5以上支持中文
版本不是8.5以上的不支持中文
使用URL编码 解码
Cookie uc = new Cookie("username", URLEncoder.encode(username, "utf-8"));
Cookie pc = new Cookie("password", URLEncoder.encode(password, "utf-8"));
username = URLDecoder.decode(uc.getValue(), "utf-8");
password = URLDecoder.decode(pc.getValue(), "utf-8");
3.Cookie被禁用或阻止的问题
cookie请求头就带不过去了
服务器端Session–会话域
Session会话域,范围是在一次会话中(浏览器和服务器,这一次都不关闭)这次会话包含了多次的请求和响应
Java实现Session:
HttpSession session = request.getSession();
session.setAttribute("msg", "hehe");
Object msg = session.getAttribute("msg");
session.removeAttribute("msg");
Session细节
1.服务器不关,断开浏览器:
当我们第一次请求,建立了会话,往会话域中存了数据,如果我们关闭了浏览器,也就是断开了这次会话,你在打开浏览器,那之前在上一次会话中的数据,就取不到了
2.浏览器不关,正常关闭服务器:
能取到数据,服务器有一个钝化和活化机制
钝化:当正常退出服务器时,服务器会把这次会话对象session序列化到磁盘上保存
活化:当你再次启动服务器,服务器又会把上次保存在磁盘上的session对象在读回来
3.session生命周期
a.创建:当调用request.getSession()
会根据jsessionid值查找到session对象,如果没找到,则创建新的session对象,给他分配一个新的jsessionid
b.销毁:服务器强制关闭
正常退出会有钝化机制
c.手动调用方法销毁:session.invalidate()
d.session超超时销毁,默认是30分钟,客户端没有任何操作,服务器销毁session
4.request.getSession()会根据jsessionid值查找到session对象
request.getSession(true)
true默认值,会根据jsessionid值查找到session对象,如果没找到,则创建新的session对象
false,会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null
5.如果客户端禁用了 cookie,session该如何自处?
●通过url重写,把sessionid作为参数追加的原url中,后续的浏览器与服务器交互中携带sessionid参数。
●服务器的返回数据中包含sessionid,浏览器发送请求时,携带sessionid参数。
●通过Http协议其他header字段,服务器每次返回时设置该header字段信息,浏览器中js读取该header字段,请求服务器时,js设置携带该header字段。
URL重写:http://localhost:8080/sessionExercise/demo;jsessionid=E5F92CFD2B256EE2548AE01CC56B2E62
PrintWriter pw = response.getWriter();
HttpSession session = request.getSession();
String id = session.getId();
String href = "/sessionExercise/demo";
href = response.encodeRedirectURL(href);
System.out.println(href);
pw.write("<a href='"+href+"'>demo</a>");