1. 会话技术
什么是会话
用户开一个浏览器,- 点击多个超链接,访问服务器多个web资源。然后关闭浏览器,整个过程称之为一个会话。
和打电话一样,电话接收,开始会话,电话 挂断,结束会话。
会话技术解决什么问题
- 保持各个客户端自己的数据
- 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
2. 服务器怎样把 Cookie 写给客户端
2.1 创建Cookie
Cookie cookie = new Cookie(String cookieName, String cookieValue);
- cookie会以响应头的形式发送给客户端
- Cookie只能存储非中文的字符串
2.2 向客户端发送cookie
response.addCookie(cookie名称)
2.3 访问
-
第一次访问时, 请求头当中没有cookie
-
第一次访问时, 响应当中会看到set-cookie
-
再一次访问时, 请求头当中就能够看到cookie信息
-
访问服务器的任何资源,一般情况下都会把cookie带去过
2.4 Cookie默认存储时间
- 默认cookie的会话级别
- 打开浏览器,关闭浏览器为一次会话
- 如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭,cookie信息销毁
设置Cookie在客户端的存储时间
cookie.setMaxAge(int seconds);
- 设置的时间为秒
- 如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里
- 过期会自动删除
2.5 设置Cookie的携带路径
- 访问某一个资源时,如果每一外资源都携带cookie信息,会影响传输速度。
- 如果不设置携带路径,默认情况下会在访问创建cookie的web资源相同的路径,都携带cookie信息。
- 在myxq/CookieServlet下创建的cookie
- 在myxq/下的index.jsp访问时会携带cookie
- 不是在myxq下,不会携带cookie
设置携带路径
cookie.setPath(String path);
- cookie.setPath(“/CookiePro/cookieServlet”);
- 只有访问cookieServlet才携带cookie信息
- cookie.setPath(“/CookiePro”);
- 访问指定的工程时, 都会携带cookie信息
- cookie.setPath(“/”);
- 访问服务器下部署的所有工程时都会携带cookie
2.6 删除Cookie
- 如果想删除客户端的已经存储的cookie信息
- 使用同名同路径的持久化时间为0的cookie进行覆盖即可
3. 服务器如何获取客户端携带的 cookie
通过Request对象的 getCookies() 方法,获取的是所有的cookie,要进行遍历,找出自己名称的那一个。
示例代码
4. Cookie 应用—记录上次登录时间
需求
访问时,显示上次的登录时间
步骤
- 第一次访问时,获取当前的时间,并把它写到cookie当中,响应给浏览器
- 第一次访问,告诉用户是第一次访问
- 用户下次访问时,获取用户携带的cookie,把日期在浏览器当中显示,记录最新的cookie
示例代码
5. session简介
- Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据
- 客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间
- Session需要借助于Cookie存储客户的唯一性标识SessionID
Session如何办到在一个servlet当中存数据,在别的servlet当中取出当初存储的数据:
- 每一个用户访问服务器时,会给该用户分配他自己对应的存储空间
- 并且创建的存储空间有一个编号我们称为SessionID
- 第一次访问时, 会把对应的sessionID以Cookie的形式写给浏览器
- 下次再访问时, 会携带sessionID,找到当初创建的那个存储空间
- 在对应的存储空间当中取出数据
6. 学习Session
6.1 学习如何获取Session对象
HttpSession session = request.getSession();
- 获得专属于当前会话的Session对象
- 如果服务器端没有该会话的Session对象,会创建一个新的Session返回
- 如果已经有了属于该会话的Session直接将已有的Session返回
- 本质就是根据SessionID判断该客户端是否在服务器上已经存在session了
6.2 学习怎么样向session当中存取数据
Session对象也是一个域对象
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
其它域对象:
- application域(servletContext域)
- request域
- pageContext域
6.3 session的生命周期
创建
第一次执行下面语句时创建
request.getSession()
销毁
- 服务器关闭时
- session过期/失效(默认30分钟,是从最后一次操作结束时计时)
- 手动销毁 session.invadate
- 浏览器关闭,session就销毁,这句话是不正确的
作用范围
默认在一次会话中,也就是说在一次会话中任何资源公用一个session对象
6.4 JsessionID持久化
默认情况下,第一次获取session对象时, 会帮你创建一个session,可以获取该Session的ID,会自动的把id写到cookie当中。
存在的问题
- 第一次访问sevlet1时存储一些数据
- 在第二个servlet当中直接取数据,可以直接取到
- 把浏览器关闭,直接到第二个servlet当中取数据,发现取不到数据了。
原因
- 因为访问的时候要求带着jsessionID。
- 由于默认情况下,存储cookie是会话级别的,关闭浏览器,就没有了。
- 所以再次打开浏览器。访问资源时,没有jsessionID. 就会创建一个新的session. 就取不到数据了
解决办法
- 在写数据时,自己手动去把sessionID写到cookie当中。
- 写的时候,设置持久化时间。
- 注意,key值一定是和它自动生成的key值是一样的