【笔记】JavaWeb的Session

前言

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。有关使用Session 对象的详细信息,请参阅“ASP应用程序”部分的“管理会话”。注意会话状态仅在支持cookie的浏览器中保留。(百度百科

原理

  • Session是基于Cookie实现的,当Servlet中存储了一个Session,在响应给客户端时,Tomcat会自动将Session的id作为Cookie(Set-Cookie: JSESSIONID=<id>)传递给客户端进行保存,当下一次请求从Cookie中得到Session的id时,服务端再根据id获取Session中的数据

  • 传递Session的id的Cookie超时时间是缺省值,当浏览器关闭会销毁,所以Session不适合长期存储数据

获取Session对象

  • 因为Session是服务器自动创建的,所以不需要创建Session对象
1
HttpSession session = req.getSession();

重载方法

  • 如果有,则返回Session对象
  • 如果没有,则创建并返回Session对象
1
HttpSession session = req.getSession(true);
  • 如果有,则返回Session对象
  • 如果没有,则返回null值
1
HttpSession session = req.getSession(false);

对Session对象的操作

获取Session编号

1
session.getID();

写入Session数据

  • Session是以键值对的形式存入的
  • 写入Session数据后就可以直接在其他Servlet中获取Session存储的数据了

<key>:键,String类型
<value>:值,Object类型

1
session.setAttribute("<key>", <value>);

获取Session数据

  • 返回Object类型
1
session.getAttribute("<key>");

删除Session数据

1
session.removeAttribute("<key>");

设置Session有效期

  • Session有效期默认30分钟。如果值为-1,则为永不过期(浏览器未关闭的情况下)

<num>:单位:秒

1
session.setMaxInactiveInterval(<num>);

统一设置Session有效期

  • 在web.xml配置中设置Session有效期,缺省值为30
tomcat/con/web.xml
1
2
3
<session-config>
<session-timeout><num></session-timeout>
</session-config>

Session的销毁

自动销毁

  • 默认情况下,当超过30分钟没有访问session,session就会超时销毁。(30分钟是默认时间,可以修改,但不推荐修改)

手动销毁

  • 调用session的invalidate方法时,会立即销毁session
1
session.invalidate();

服务器正常关闭

  • 钝化(序列化):当服务器正常关闭,在关闭之前,服务器会将内部的session对象序列化保存到服务器的work目录下,变为一个文件
  • 活化(反序列化):再次将服务器启动起来,钝化着的session会再次回到服务器,变为服务器中的对象

意外身亡

  • 当服务器非正常关闭时(硬件损坏,断电,内存溢出等导致服务器非正常关闭),session会随着服务器的关闭而销毁

完成

参考文献

哔哩哔哩——黑马程序员