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对象);