1. 介绍
- Session 就一个接口(HttpSession)。
- Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个 Session 会话。
- Session 会话中经常用来保存用户登录之后的信息。
2.如何创建 Session 和获取(id 号,是否为新)
如何创建和获取 Session的 API 是一样的:
request.getSession()
- 第一次调用:创建 Session 会话
- 此后调用:获取之前创建好的 Session 对象。
判断Session是不是新创建的:
HttpSession session = req.getSession();
boolean aNew = session.isNew();
3. Session域
Session域是javaweb四大域之一
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset:UFT-8");
HttpSession session = req.getSession();
session.setAttribute("key1","value1");
resp.getWriter().println("attribute存储成功");
}
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset:UFT-8");
HttpSession session = req.getSession();
Object key1 = session.getAttribute("key1");
resp.getWriter().println(key1);
}
4. Session 生命周期
Session 默认的超时时间长为 30 分钟。这是因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它表示配置了当前Tomcat服务器下所有的Session
<session-config>
<session-timeout>30</session-timeout>
</session-config>
若希望改变 web 工程默认的 Session 的超时时长为其他时长,可在/web/WEB-INF目录下的web.xml 配置文件中做
以上相同配置。
<!--表示当前web工程。创建出来的所有Session默认是20分钟超时时长-->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
若想只修改个别 Session 的超时时长,可使用setMaxInactiveInterval以设置 Session 的超时时间(以秒为单位);超过指定的时长,Session
就会被销毁。
- interval为正数的时候,设定 Session 的超时时长。
- interval为负数表示永不超时(极少使用)
public void setMaxInactiveInterval(int interval)
//获取 Session 的超时时间
public int getMaxInactiveInterval()
//使当前 Session 会话马上超时无效。
public void invalidate()
5. Session技术内幕
Session 技术的底层是基于 Cookie 技术来实现的:
6. Session的活化与钝化
- Session活化:从硬盘上读取序列化的session到内存中
- Session钝化:把内存中的session序列化到硬盘上
Tomcat中两种Session钝化管理器
session钝化机制是由sessionManager管理
tomcat提供了以下这两种session处理方式
org.apache.catalina.session.StandarManager
org.apache.catalina.session.Persistentmanager
StandarManager是tomcat的session默认处理方式,如果配置Persistentmanager则使用Persistentmanager,没有配置则使用StandarManager。
1. StandarManager
- 当Tomcat服务器关闭或者重启时tomcat服务器会将当前内存中的session对象钝化到服务器文件系统中;
- 另一种情况是web应用程序被重新加载时(其实原理也是重启tomcat),内存中的session对象也会被钝化到服务器的文件系统中
- 当系统启动时,会把序列化到硬盘上session重新加载到内存中来。这样用户还保持这登录状态,提供系统的可用性。
1. 只有在tomcat关闭和启动的时候才会活化和钝化session
2. 强制kill掉tomcat是不会把session钝化到硬盘上的
2. Persistentmanager
可以将内存中长时间不用的session钝化到硬盘上,减少内存的占用。
例如:当网站有大量用户访问的时候,服务器会创建大量的session,会占用大量的服务器内存资源,当用户开着浏览器一分钟不操作页面的话建议将session钝化,将session生成文件放在tomcat工作目录下。
设置方法: 在 /web/WEB-INF 目录下创建 context.xml文件(也可以在tomcat目录下的其他四个地方创建,在这里建是为了只对这个网站起作用),配置如下:
<?xml version="1.0" ?>
<Context>
<Manager className="org.apache.catalina.session.PersistentManager"
maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore"
directory="sessionDir" />
</Manager>
</Context>
7. Cookie和Session的区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以建议:
- 将登陆信息等重要信息存放为session
- 其他信息如果需要保留,可以放在cookie中