#会话技术——Session

Session

1.什么是Session?
服务器会话技术。当服务器运行的时候,会为各自的浏览器建立单独的session,当浏览器访问服务器时,服务器会将数据存储在各自的session中,当浏览器再次访问其他服务器,其他web资源再从用户各自的session中取出数据为用户服务.总而言之,将数据保存在服务器.
2.Session的特点
    1.共享一次会话中多个请求的数据
    2.可以储存任意类型,任意大小的诗句
    3.数据存储在服务器中

Session的原理

![](https://img2020.cnblogs.com/blog/1668748/202004/1668748-20200428150829839-327489964.png)
Session其本质就是一个会话Cookie(浏览器关闭后,Session就失效了)

Session的操作

1.获取Session对象
    request.getSession(true);获取Session对象,如果没有Session对象,直接创建一个新的返回,缺省值
    request.getSession(false):获取Session对象,如果没有返回null
    request.getSession(): 和参数为true的一样
2.设置共享数据
    1.往Session中存储数据
        session.setAttribute(String name, Object value);
    2.从Session中取出数据
        Object value = session.getAttribute(String key);

3.删除Session(用户注销登录)
    1.删除Session中指定属性名的值.
    session.removeAttribute(String name)
    2.销毁Session对象(Session中所有属性都不存在了)
    session.invalidate();
4.Session的超时管理
    超时:在访问当前的资源的过程中,不和网页进行任何的交互,超过设定的时间就是超时.超时后就会销毁Session
        1.void session.setMaxInactiveInterval(int interval)
        在服务器中有默认的配置为30分钟,通常不需要去修改
5.URL重写(在url后面拼接jsessionid,解决浏览器禁用Cookie)
    问题: 当浏览器禁用Cookie之后,那么我们的jsessionid就不能在浏览器中保存,那么后面的请求中就不会将jsessionid发送到服务器,服务器这面就找不到数据
    解决方案:
    1.在url后手动的拼接上jsessionid
    String jessionid = session.getId();
    out.println("<a href='/session/list;jsessionid="+jsessionid+"'>收件箱(5)</a>)

细节

1.客户端关闭,服务器不关闭,我们再获取Session的对象是同一个吗
    答:不是,如果想获取同一个,我们可以在接收时设置如下代码
    Cookie cookie =new Cookie("Jsessionid",session.getId());
    cookid.setMaxAge(60*60);
    respond.addCookie(cookie);
2.服务器关闭,客户端不关闭,我们获取的Session对象是同一个吗
    答:不是,但数据不会被销毁
        *session的钝化:
            在服务器关闭之前,将session序列化在硬盘上
        *session的活化
            在服务器启动后,将session文件转化为session对象即可(反序列化)
3.Session什么时候销毁
    1.服务器关闭
    2.session对象调用invalidate()
    3.session默认时长为30分钟
4.一般的,我们存储到Session中的属性名称,要唯一,起名规范XXX_IN_SESSION
    session.setAttribute("USER_IN_SESSION","ZYGui");
5.若需要把多个数据存放到Session中,就要调用setAttribute方法N次,一般将存储的数据封装成一个对象,然后存储到Session中.把用户的信息,封装到user对象.
    session.setAttribute(“USER_IN_SESSION”, user对象);
原文地址:https://www.cnblogs.com/linjing111/p/12794689.html