- Session的基本使用
- 概念
Session:服务端会话跟踪技术:将数据保存到服务端。 - Session的工作流程
- 在服务端的AServlet获取一个Session对象,把数据存入其中
- 在服务端的BServlet获取到相同的Session对象,从中取出数据
- 就可以实现一次会话中多次请求之间的数据共享了
- 现在最大的问题是如何保证AServlet和BServlet使用的是同一个Session对象
- Session的基本使用
具体的使用步骤为:
- 获取Session对象,使用的是request对象
HttpSession session = request.getSession();
- 概念
- Session对象提供的功能:
- 存储数据到 session 域中
void setAttribute(String name, Object o)
- 根据 key,获取值
Object getAttribute(String name)
- 根据 key,删除该键值对
void removeAttribute(String name)
- Session常用方法的使用
void setAttribute(String name, Object o) Object getAttribute(String name)
- Session的原理分析
1.用户第一次访问的时候,tomcat会创建对应的session容器,每个容器具有唯一的标识JSESSIONID,然后tomcat底层创建会话级别的cookie存储唯一标识JSESSIONID存储到浏览器端。
2.用户再次访问,tomcat中取出session并从cookie中取出之前保存的唯一标识JSESSIONID进行比较查找自己的session容器
3.介绍完Session的原理,我们只需要记住:Session是基于Cookie来实现的- Session的使用细节
- 浏览器关闭后,session持久化方案
tomcat在创建cookie的时候属于会话级别的cookie,关闭浏览器,cookie消失,下次打开浏览器不会携带之前的cookie即cookie中的JSESSIONID到tomcat服务器中了,那么这样会造成tomcat服务器中会有很多个不能使用的session容器(session依然还在,只是找不到了)。严重的话会造成服务器宕机。 - 持久化session来解决上述问题
主要问题是cookie是会话级别的,我们只需要将会话级别的cookie变为持久化级别的即可,持久化session就是持久化cookie。
步骤:
1.创建session
2.获取session的JSESSIOID的值
3.创建Cookie ,Cookie(“JSESSIOID”,值)
4.使用cookie对象调用方法setMaxAge()进行cookie的持久化,存活时间建议30min
5.将cookie响应给浏览器//1.创建session HttpSession session = request.getSession(); //2.获取session的JSESSIOID的值 String sessionId = session.getId(); System.out.println(sessionId); //3.创建Cookie ,Cookie("JSESSIOID",值) Cookie cookie = new Cookie("JSESSIONID", sessionId); //4.使用cookie对象调用方法setMaxAge()进行cookie的持久化,存活时间建议30min cookie.setMaxAge(60*30); //5.将cookie响应给浏览器 response.addCookie(cookie);
Session销毁
session的销毁会有两种方式:- 默认情况下,无操作,30分钟自动销毁
对于这个失效时间,是可以通过配置进行修改的
在项目的web.xml中配置 ``` <?xml version=”1.0” encoding=”UTF-8”?>
<session-timeout>10</session-timeout>
```
- 默认情况下,无操作,30分钟自动销毁
调用Session对象的invalidate()进行销毁
在SessionDemo2类中添加session销毁的方法//获取数据,从session中 //1. 获取Session对象 HttpSession session = request.getSession(); System.out.println(session); // 销毁 session.invalidate(); //2. 获取数据 Object username = session.getAttribute("username"); System.out.println(username);