17.Session
2018-06-19 本文已影响0人
若愚同学
Session底层依然是Cookie.浏览器关闭就失效(会话Cookie).
Session:
是一种服务端技术,把共享数据保存在服务端,解决会话跟踪
每一个请求如何从服务端寻找共享数据:
服务端先分配一个Session的存储ID地址(jsessionid)给浏览器.浏览器每次请求的时候,都会带着jsessionid的值,再从该jsessionid的内存空间中去取数据.
生活中的实例:
客户 服务端(健身房老板)
第一次 办卡,卡号为123456,把卡号给客户
非第一次 123456,我再去查询id为123456的空间(数据)
Session的操作:
1):获取Session对象/创建Session对象.
HttpSession session = request对象.getSession();等同于getSession(true);
HttpSession session = request对象.getSession(true);:如果当前有Session对象,就直接返回,若没有,则先创建一个再返回.
HttpSession session = request对象.getSession(false);:如果当前有Session对象,就直接返回,若没有,则返回null.
2):把共享数据存储在Session中.
Session对象.setAttribute(String name,Object value);
session.setAttribute("currentNae","will");
3):从Session中获取共享数据:
Object val = session.getAttribute("currentName");
4):修改Session中的共享数据.
重新设置一个同名的属性名
session.setAttribute("currentName","Lucy");
5):删除Session中的共享数据.
从Session中删除指定名的属性值.
session.removeAttribute("cuurentName");
6):Session的拓展:
1):一般,根据我们队大师的研究,发现session中的属性名,习惯起名为:XXX_IN_SESSION.
2):把登陆信息封装在一个对象中,再存储到Session中.
User user = new User("will",.....);
session.setAttribute("USER_IN_SESSION",user);
3):一般的我们习惯把放入Session的对象,让它实现序列号接口(java.io.Serializable).
原因:
当多台服务集群的时候,彼此之间可以共享Session数据(在网络上传输数据).
序 列 化:
把对象转换为二进制数据.(对象流)
反序列化:
把二进制数据恢复成对象.(对象流)
7):销毁Session对象(注销登录):
session.removeAttribute("USER_IN_SESSION")方法,只能删除Session中指定名称的属性.
session.invalidate():销毁整个Sssion对象.
8):Session的超时管理.
session.setMaxInactiveInterval(int seconds);
session.setMaxInactiveInterval(15);
若上一次操作之后,15秒内不再次和该网页交互,则Session会被自动销毁.
两次操作的间隔时间不能超过15秒,若超过自动销毁Session.
一般的,不需要我们去设置,在Tomcat中,默认的超时时间为30分钟(一般在20分钟就被销毁了).
<session-config>
<session-timeout>30<session-timeout>
</session-config>
9):当Cookie被禁用之后,URL重写问题.
方式一:将jsessionid直接拼接到url后面
/session/list;jsessionid=1067B32F8F96EB10871A7E103F22811B
方式二:使用URL重写,自动的根据浏器是否禁用Cookie来拼接jsessionid
String url = resp.encodeURL("/session/list");
out.print("<a href='" +url +"'>收件箱(4)</a><br/>");