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/>");
上一篇下一篇

猜你喜欢

热点阅读