久违了,之前忙碌了一周赶毕设,今天抽空更新~
一.理论知识
1.会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应~
2.会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求之间共享数据~
需要注意的是,HTTP请求协议是无状态的(为了保证每次请求的速度不慢),每次浏览器向服务器发送请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据的共享~
二.Cookie客户端会话跟总监技术
1.使用
如上图,Cookie是客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。
在某个Servlet中,首先创建Cookie对象:
Cookie cookie = new Cookie("username","Jsl");
然后调用Response对象发送Cookie对象,再添加一些提示符:
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("使用成功~");
运行Tomcat并访问Servlet:
Chrome浏览器中查看数据:
Cookie已经被保存。
再新建另一个Servlet:
获取Cookie数组:
Cookie[] cookies = req.getCookies();
写下面一段循环:目的是获取上面咱们自定义的Cookie数据:
for(Cookie cookie:cookies){
String name=cookie.getName();
if("username".equals(name))
{
String value = cookie.getValue();
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(name+":"+value);
}
}
重新启动Tomcat并访问AServlet:
再访问BServlet:获取成功!
以上即为一次会话中两次请求之间共享数据的经典案例~
2.原理
Cookie的实现是基于Http协议的。 在发送数据的时候使用set-Cookie响应头将数据发送到浏览器的内存中,而获取数据的时候使用cookie请求头来获取到cookie的数据。
3.生命周期
默认情况下,Cookie由于存储在浏览器内存中,当浏览器关闭时内存释放,Cookie即会被销毁~
setMaxAge(int seconds):设置Cookie存活时间:
- 正数:将Cookie写入浏览器所存在电脑的硬盘,持久化存储,到时间即自动删除
- 负数:默认值,浏览器关闭则会将Cookie销毁
- 零:删除Cookie
4.设置中文
Cookie不能直接存储中文,需要进行URL转码。
创建对象时先编码:
String name="拜仁慕尼黑~";
URLEncoder.encode(name);
Cookie cookie=new Cookie("name",name);
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("使用成功~");
获取时再解码:
Cookie[] cookies = req.getCookies();
for(Cookie cookie:cookies){
String name=cookie.getName();
if("name".equals(name))
{
String value = cookie.getValue();
value= URLDecoder.decode(value);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write(name+":"+value);
}
}
如下,中文汉字的数据亦可成功存储到cookie之中~
三.Session服务器会话跟总监技术
1.使用
Session即服务端会话跟踪技术:将数据保存到服务端~JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能~
获取Session对象并传入值:
HttpSession session = req.getSession();
session.setAttribute("name","jsl");
在另一个Servlet中获取Session对象的数据:
HttpSession session=req.getSession();
Object name=session.getAttribute("name");
System.out.println(name);
分别访问C和D两个Servlet后控制台成功输出:
2.原理
Session基于Cookie实现:
如上,在一次会话中,多次请求之间的Cookie是同一个值~
本质还是将Session的唯一标识id作为Cookie值在多次请求之间共享:通过响应头获取id,再将id通过请求头传输给别的请求~
3.钝化、活化
服务器重启后,Session中的数据还存在~
- 钝化:在服务器正常关闭之后,Tomcat会自动将Session数据写入硬盘的文件中~
- 活化:再次启动服务器后,从文件中加载数据到Session中~
Session数据想共享,浏览器一定不能关闭~
4.销毁
- 默认情况下无操作30分钟后会自动销毁~
- 也可以使用invalidate()方法将自己销毁~
四.对比
(服务器很难被攻破~)
- 购物车一般使用Cookie(长期存储~)
- 偏好设置一般用Cookie(长期存储~)
- 用户名展示一般用Session(安全保护~)
- 需要一提的是,保存密码30天之类的功能,是一种不太安全的操作~
- 验证码不能“不打自招”,必须使用Session~