什么是Session
当人们去医院就诊时,就诊病人需要办理医院的就诊卡,该卡上只有卡号,而没有其它信息。但病人每次去该医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病历档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
验证码为什么要使用Session
1. 验证码的生成和登录时验证码的校验 属于多次请求,request无法完成!
2. Cookie是有大小和个数的限制的,Session存到服务器端的技术,没有大小和个数的限制.
3. Cookie相对于Session来讲不安全.
Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式,具体如下。
public HttpSession getSession(boolean create)
public HttpSession getSession()
上面重载的两个方法都用于返回与当前请求相关的HttpSession对象。
区别:
第一个getSession()方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。
第二个getSession()方法则相当于第一个方法参数为true时的情况,在相关的HttpSession对象不存在时总是创建新的HttpSession对象。
要想使用HttpSession对象管理会话数据,不仅需要获取到HttpSession对象,还需要了解HttpSession对象的相关方法。
HttpSession接口中定义的操作会话数据的常用方法。
HttpSession接口中的常用方法
方法声明 | 功能描述 |
---|
String getId() | 用于返回与当前HttpSession对象关联的会话标识号 |
long getCreationTime() | 返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式 |
long getLastAccessedTime() | 返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式 |
void setMaxInactiveInterval(int interval) | 用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔 |
boolean isNew() | 判断当前HttpSession对象是否是新创建的 |
void invalidate() | 用于强制使Session对象无效 |
ServletContext getServletContext() | 用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象 |
void setAttribite(String name,Object value) | 用于将一个对象与一个名称关联后存储到当前的HttpSession对象中 |
String getAttribute() | 用于从当前HttpSession对象中返回指定名称的属性对象 |
void removeAttribute(String name) | 用于从当前HttpSession对象中删除指定名称的属性 |
小结常用的api:
request.getSession(); // session的获取
session.setAttribute(key,value);// session 存储数据
session.getAttribute(key);// session 获取存储对应的数据
session.invalidate(); // session对象销毁
session.removeAttribute(key);// 将目标对象从session中移除
Session的使用场景
1. 保存购物车数据
2. 保存用户浏览器记录数据
3. 保存用户登录信息数据
4. 保存验证码
Session入门开发
开发步骤分解
:
1. 创建一个servlet: AServlet.java
2. 通过ASequest对象获取session对象,保存相关数据
3. 浏览器不关闭时,我们新建另一个servlet: BServlet.java
4. Bservlet获取Aservlet保存的session数据
代码实现:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();// 获取session实例api
// 服务器端创建session 自动发送会话级别Cookie JSESSIONID value : session.getId()
// 存储数据 setAttribute
session.setAttribute("heimasession","你好 session");// 服务器内存 session保存用户数据
session.setAttribute("tom","你好 tom");// 服务器内存 session保存用户数据
session.setAttribute("marry","你好 marry");// 服务器内存 session保存用户数据
// 只要浏览器不关闭, 多次请求 可以获取唯一session对象,获取session 存储的值
System.out.println("---session 保存数据完成。。。");
}
获取session存储数据
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();// 获取session实例api
// if(jessionId==null){
// create
// }else {
// jessessionid== sessi.getId(){
// return session
// }else{
// create
// }
// }
// 浏览器访问服务器 自动发送所有的cookie request.getSession();
// 判断 sessionId == JESSIONID VALUE是否相同 如果相同 :找到session对象
// 如果 sessionId != JESSIONID VALUE 服务器端重新创建session对象
// 获取session保存数据
// 手动 代码销毁session对象
// session.invalidate();// 销毁session对象
String heimasession = (String)session.getAttribute("heimasession");
String tom = (String) session.getAttribute("tom");
String marry = (String) session.getAttribute("marry");
System.out.println("session value = "+heimasession+ " "+tom+" "+marry);
}
注意 浏览器不要关闭! 因为cookie丢失,找不到服务器端的session对象
session默认销毁时间:30分钟!
Session的生命周期
session的创建
session默认的时间
session的销毁