小朽不才,最近喜欢上了萨克斯,一年计划[传送门]中的实行。就伴随着一首萨克斯,整理了下Session管理和Session四种技术。html
保存状态:java
装好了哨片,拿着迪头准备第一次,中音试吹程序员
①它是一种追踪技术,将一个或多个token添加到URL中:{格式 键 = 值} web
url?key_1=value_1&key_2=value_2 ...
②但有弊端:apache
#url限制2000个字符浏览器
#空格 & 符合 问号 需编码tomcat
#信息可见,这样不是咱们期待的服务器
③获取就简单了,和咱们上一节讲的同样[传送门]:cookie
request.getParameter("key_1");
支支吾吾,响了起来。而后慢慢练呼吸。坚持5秒,10秒,15秒.....session
①它相比上一种,能够传更多的字符到服务器,而且不用字符编码。
典型的例子:{form 表单更新时候,Person类}
<form method ="post" action=""> <input type="hidden" name="personId" value="" > <input name="name" value=""> <input type="submit" value="Update"> </form>
支支吾吾,坚持30秒!很开心
它能自动在web服务器,浏览器直接来回传递小块信息。每台web服务器支持20个cookie。但,浏览器能够拒绝接受cookie。
①建立:[也能够js建立删除]
Cookie cookie = new Cookie(name,value);
发送给浏览器,就须要HttpServletResonse[传送门]:
httpServletResponse.add(cookie);
②删除:为了删除cookie,建立一个同名的cookie,而后设置maxAge为0
我把手轻轻放在键上,我急切的想听下音,可是还学技法,慢慢来。
强大的对象:
用户能够没有,或者有一个它,而且只能访问本身的HttpSession。
①获取HttpSession:
HttpSession getSession()返回当前的HttpSession,若没有,则建立一个返回。
HttpSession getSession(true) 和HttpSession getSession()同样。
HttpSession getSession(false)若没有,返回null。
HttpSession getSession() HttpSession getSession(boolean create)
源码:
HttpSession getSession()只不过调用了getSession(true) 。
public HttpSession getSession() { return (getSession(true)); }
与上面三种技术不一样是,HttpSession存在内存中,因此保存内容要谨慎。若是一个java对象类实现了java.io.Serializable则能够存入HttpSession。但要求不一样名称,否则的话,新值覆盖旧值(想必这是咱们喜欢的)。
②获取HttpSession保存的对象:
java.lang.Object getAttribute(java.lang.String name)
③注意,HttpSession中保存的值不发送到客户端,这与其余Session管理方式不一样,而Servlet容器为它每一个HttpSession建立一个惟一标识符,将这个做为标识符token发送个浏览器,或做为cookie,或参数添加到url。不管哪种均可以指的是哪一个用户发出请求,这就是session如何区分不一样用户机制。
天然,能够查看这个标识符JSESSIONID
java.lang.String getId()
如图,有真相
第一次访问:
第二次访问:
④数据结构
在servlet/jsp中,容器是用何种数据结构来存储session相关的变量的呢?咱们猜想一下,首先它必须被同步操做,由于在多线程环境下session是线程间共享的,而web服务器通常状况下都是多线程的(为了提升性能还会用到池技术);其次,这个数据结构必须容易操做,最好是传统的键值对的存取方式。 那么咱们先具体到单个session对象,它除了存储自身的相关信息,好比id以外,tomcat的session还提供给程序员一个用以存储其余信息的接口(在类org.apache.catalina.session. StandardSession里):
public void setAttribute(String name, Object value, boolean notify) |
在这里能够追踪到它到底使用了何种数据:
protected Map attributes = new ConcurrentHashMap(); |
tomcat使用了一个ConcurrentHashMap对象存储数据,这是java的concurrent包里的一个类。它恰好知足了咱们所猜想的两点需求:同步与易操做性。 那么tomcat又是用什么数据结构来存储全部的session对象呢?果真仍是ConcurrentHashMap(在管理session的org.apache.catalina.session. ManagerBase类里):
protected Map sessions = new ConcurrentHashMap(); |
具体缘由就没必要多说了。至于其余web服务器的具体实现也应该考虑到这两点。
艺术是相通的,我以为萨克斯,和coding,CS,我称它CA(COMPUTER ART).因此我很喜欢coding,也很喜欢艺术。
网址重写,隐藏域主要用于“轻量化”的Session追踪技术。cookie和HttpSession比较灵活,可是绝非五局限。要特别当心,每一个对象都会消耗内存。