会话
用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。
-
从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
-
会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着
-
浏览器和服务器就可以继续使用该会话进行
请求发送和响应,上述的整个过程就被称之为会话。


Cookie的使用
1.发送cookie
//发送Cookie
//1. 创建Cookie对象
// Cookie cookie = new Cookie("username","zs");
String value = "张三";
//URL编码
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存储数据:"+value);
Cookie cookie = new Cookie("username",value);
2.获取cookie
//1. 获取Cookie数组
Cookie[] cookies = request.getCookies();
//2. 遍历数组
for (Cookie cookie : cookies) {
//3. 获取数据
String name = cookie.getName();
if("username".equals(name)){
String value = cookie.getValue();
//URL解码
value = URLDecoder.decode(value,"UTF-8");
System.out.println(name+":"+value);
break;
}
}

Cookie原理

(1)访问AServlet对应的地址 http://localhost:8080/cookie-demo/aServlet
F12+回车打开开发者工具

Cookie使用细节
- Cookie存活时间
默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁
所以我们现在就遇到一个难题是如何将Cookie持久化存储?
Cookie其实已经为我们提供好了对应的API来完成这件事,这个API就是setMaxAge,
设置Cookie存活时间
setMaxAge(int seconds)
参数值为:
1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除
2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁
3.零:删除对应Cookie
接下来,咱们就在AServlet中去设置Cookie的存活时间
- Cookie存储中文
Cookie不能直接存储中文
如需要存储,则需要进行转码:URL编码
@WebServlet("/aServlet")
public class AServlet extends HttpServlet {
@Override
//(2)在BServlet中获取值,并对值进行解码
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
//发送Cookie
String value = "张三";
//对中文进行URL编码
value = URLEncoder.encode(value, "UTF-8");
System.out.println("存储数据:"+value);
//将编码后的值存入Cookie中
Cookie cookie = new Cookie("username",value);
//设置存活时间 ,1周 7天
cookie.setMaxAge(60*60*24*7);
//2. 发送Cookie,response
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
this.doGet(request, response);
}
}
Session
- 服务端会话跟踪技术:将数据保存到服务端
- JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能

@WebServlet("/demo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存储到Session中
//1. 获取Session对象
HttpSession session = request.getSession();
System.out.println(session);
//2. 存储数据
session.setAttribute("username","zs");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
Cookie原理
- Cookie的实现是基于HTTP协议
- 响应头:set-cookie
- 请求头:cookie

Session使用细节
首先需要大家思考的问题是:
服务器重启后,Session中的数据是否还在?
要想回答这个问题,我们可以先看下下面这幅图,

(1)服务器端AServlet和BServlet共用的session对象应该是存储在服务器的内存中
(2)服务器重新启动后,内存中的数据应该是已经被释放,对象也应该都销毁了
所以session数据应该也已经不存在了。但是如果session不存在会引发什么问题呢?
举个例子说明下,
**
- (1)用户把需要购买的商品添加到购物车,因为要实现同一个会话多次请求数据共享,所以假设把数据存入Session对象中
- (2)用户正要付钱的时候接到一个电话,付钱的动作就搁浅了
- (3)正在用户打电话的时候,购物网站因为某些原因需要重启
- (4)重启后session数据被销毁,购物车中的商品信息也就会随之而消失
- (5)用户想再次发起支付,就会出现问题
所以说对于session的数据,我们应该做到就算服务器重启了,也应该能把数据保存下来才对。**
Cookie与Session小结
Cookie 和 Session 都是来完成一次会话内多次请求间数据共享的。
所需两个对象放在一块,就需要思考:
Cookie和Session的区别是什么?
Cookie和Session的应用场景分别是什么?
区别:
- 存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
- 安全性:Cookie不安全,Session安全
- 数据大小:Cookie最大3KB,Session无大小限制
- 存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟
- 服务器性能:Cookie不占服务器资源,Session占用服务器资源
应用场景:
- 购物车:使用Cookie来存储
- 以登录用户的名称展示:使用Session来存储
- 记住我功能:使用Cookie来存储
- 验证码:使用session来存储
结论
Cookie是用来保证用户在未登录情况下的身份识别
Session是用来保存用户登录后的数据
介绍完Cookie和Session以后,具体用哪个还是需要根据具体的业务进行具体分析。





![[附源码]Python计算机毕业设计高校心理咨询管理系统Django(程序+LW)](https://img-blog.csdnimg.cn/548eacb0651443748e9d79f0bd69e3bf.png)








![【GO】 K8s 管理系统项目[API部分--Deployment]](https://img-blog.csdnimg.cn/c25de7f500664a7a82e9c567a04c2d57.png)



![[附源码]Node.js计算机毕业设计服装创意定制管理系统Express](https://img-blog.csdnimg.cn/8b11594b51f14a1e87280eefef888051.png)
