1.Session是什么:

"会话控制",Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个会话中一直存在下去。当用户请求来自应用程序的Web页面时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或者被放弃后,服务器将终止该会话。注意:会话状态只在支持Cookie的浏览器中保存

2.Session是何时创建的

当浏览器第一次访问服务器一个页面之后由服务器创建的,并使用特殊算法算出一个Session的ID(JSESSIONID),以Cookie的方式保存在客户端中,而这个JSESSIONID在随后的请求中会被用来获得已经创建的Session;在Session被创建之后,就可以调用Session的相关方法往Session中增加内容了,而这些内容只会保存在服务器中,响应给客户端的只有JSESSIONID;当客户端再次发送请求的时候,会将这个

JSESSIONID带上,服务器接收到请求之后就会依据JSESSIONID找到响应的Session。

1568344560794.png

浏览器第一次访问服务器一个页面后创建JSESSIONID其实是做了这些事情

Cookie cookie=new Cookie("JSESSIONID",特殊算法算出来的Session ID);
response.addCookie(cookie);

3.Session的方法使用

HttpSession session=request.getSession();
boolean isNew();    //判断该Session对象是不是新创建的
String getId();     //获取Session对象的JSESSIONID
void setAttribute(String var1, Object var2);    //保存数据到Session对象中
Object getAttribute(String var1);       //从Session对象中取数据
void removeAttribute(String var1);      //移除Session对象中的键值对
void invalidate();      //注销Session,注销之后服务器会生成一个新的JSESSIONID
void setMaxInactiveInterval(int var1);      //设置Session失效时间的秒数
int getMaxInactiveInterval();       //获取Session失效时间的秒数
HttpSession session = req.getSession(true);    

//如果该客户端在此服务器中存在Session,就返回这个Session;如果不存在,就创建一个新的Session返回

HttpSession session = req.getSession(false); 

//如果该客户端在此服务器中存在Session,就返回这个Session;如果不存在,就返回一个null

4.设置Session对象的失效时间的三种方式

  1. 通过web容器配置在tomcat的安装目录conf\web.xml文件中找到session-config元素
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

tomcat默认session失效时间为30分钟,可以根据需要修改,如果设置参数为0或负数则session永不失效
        参数时间单位为分钟,而且必须为整数

  1. 配置项目中的web.xml文件
    在项目中的web.xml文件中配置
    <session-config>
        <!--    以分钟为单位,20分钟后失效    -->
        <session-timeout>20</session-timeout>
    </session-config>

3.通过java代码动态配置

    session.setMaxInactiveInterval(3600);//设置非活跃间隔时间

void setMaxInactiveInterval(int var1)的注意点:

    • 时间单位为秒
    • 此方法表示当前session在指定时间内若没有与服务器发生任何交互后失效
    • 期间用户的任何活动都将刷新session的失效时间

4.三种设置session失效方式的优先级

如果三种方式都设置了,那么优先级从高到低:代码设置>项目web.xml配置>容器web.xml配置

5.面试题:浏览器关闭了,Session就注销了吗?

大多人是这种思想,但其实是错误的,

  • 关闭浏览器只是存在于浏览器上的唯一标识符JSESSIONID消失了,但是服务器内存中存放的Session对象并没有立即销毁
  • Session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送任何请求来关闭Session,Session自然也不会销毁,

销毁Session的两种方式:1.设置失效时间让它自动销毁,2.手动调用invalidate()方法销毁;

  • 为什么关闭浏览器后就访问不到以前在Session中保存的数据了呢?Session中的数据保存在服务器内存中,而JSESSIONID保存在
    客户端的cookie中,关闭浏览器后cookie中的JSESSIONID就丢失了,再次打开浏览器访问服务器一个页面后会重新创建一个JSESSIONID,所以访问不到之前的数据了,之前的Session会在默认的失效时间过后失效(Tomcat中Session默认失效时间为30分钟)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐