-
什么是会话
-
会话可简单理解为:
- 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
-
看几个场景
-
登录场景:
打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名)
修改密码(输入原密码)
修改收货地址
.......
问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢?
-
购物场景:
打开浏览器 -> 浏览商品列表 -> 加入购物车(把商品信息保存下来) -> 关闭浏览器
打开浏览器-> 直接进入购物车 -> 查看到上次加入购物车的商品 -> 下订单 -> 支付
问题: 在购物会话过程中,如何保存商品信息??
-
-
会话管理:
- 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据。
-
保存数据:
- 我们会想到使用数据库保存数据,但这种保存方式不在我们问题的讨论范围,所以不考虑
-
可以使用request域对象或者context域对象嘛?不能!!!
-
登录场景重现:
使用context域对象:
小张: 输入"张三"(保存数据: context.setAttribute("name","张三")) ->用户主页(显示"张三")
小李: 输入"李四"(保存数据:context.setAttribute("name","李四")) ->用户主页(显示"李四")
问题: context是所有用户公有的资源!!!会覆盖数据。
使用request域对象:
小张: 输入"张三"(保存数据: request.setAttribute("name","张三"))- > 用户主页(显示"张三")
问题: 一定要使用转发技术来跳转页面!!!
- 解决办法: 新的域对象session,用它来保存会话数据!!!
-
-
-
两种会话技术
- Cookie技术:会话数据保存在浏览器客户端。
- Session技术:会话数据保存在服务器端。
-
Cookie
-
Cookie通过在请求和响应报文中写入Cookie信息来控制客户端的状态;
- Cookie会根据从服务器端发送的响应报文内一个叫Set-Cookie的首部字段信息,通知客户端保存Cookie.当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去.
- 服务器端发现客户端发送过来的Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
-
图示
-
没有Cookie信息状态下的请求
-
第2次以后(存有Cookie信息状态)的请求
-
-
HTTP请求报文和响应报文的内容如下:
-
请求报文(没有Cookie信息的状态)
-
响应报文(服务器端生成Cookie信息)
-
请求报文(自动发送保存着的Cookie信息)
-
-