②萨克斯,音符的悠扬(Session管理)
一.前言
小朽不才,最近喜欢上了萨克斯,一年计划[传送门]中的实行。就伴随着一首萨克斯,整理了下Session管理和Session四种技术。
保存状态:
#网址重写(URL rewriting)
#隐藏域
#cookie
#HttpSession对象
二.网址重写(URL rewriting)
装好了哨片,拿着迪头准备第一次,中音试吹
①它是一种追踪技术,将一个或多个token添加到URL中:{格式 键 = 值}
url?key_1=value_1&key_2=value_2 ...
②但有弊端:
#url限制2000个字符
#空格 & 符合 问号 需编码
#信息可见,这样不是我们期待的
③获取就简单了,和我们上一节讲的一样[传送门]:
request.getParameter("key_1");

支支吾吾,响了起来。然后慢慢练呼吸。坚持5秒,10秒,15秒.....
三.隐藏域
①它相比上一种,可以传更多的字符到服务器,并且不用字符编码。
典型的例子:{form 表单更新时候,Person类}
<form method ="post" action="">
<input type="hidden" name="personId" value="" >
<input name="name" value="">
<input type="submit" value="Update">
</form>
支支吾吾,坚持30秒!很开心
四.cookie
它能自动在web服务器,浏览器直接来回传递小块信息。每台web服务器支持20个cookie。但,浏览器可以拒绝接受cookie。
①创建:[也可以js创建删除]
Cookie cookie = new Cookie(name,value);
发送给浏览器,就需要HttpServletResonse[传送门]:
httpServletResponse.add(cookie);
②删除:为了删除cookie,创建一个同名的cookie,然后设置maxAge为0

我把手轻轻放在键上,我急切的想听下音,但是还学技法,慢慢来。
强大的对象:
五.HttpSession对象
用户可以没有,或者有一个它,并且只能访问自己的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比较灵活,但是绝非五局限。要特别小心,每个对象都会消耗内存。
http://book.douban.com/doulist/3575997/
http://kb.cnblogs.com/page/57228/
②萨克斯,音符的悠扬(Session管理)的更多相关文章
- Nhibernate的Session管理
参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...
- Openfire的启动过程与session管理
说明 本文源码基于Openfire4.0.2. Openfire的启动 Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...
- ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...
- 2016-1-30 Servlet中Session管理(Sesssion追踪)
Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...
- Redis3.2+Tomcat实现集群的Session管理 -- tomcat-redis-session-manager的编译和开发部署环境搭建
已经有不少文章介绍使用tomcat-redis-session-manager来实现Redis存储Tomcat的Session,实现分布式Session管理.但是现在官方编译的tomcat-redis ...
- tomcat架构分析 (Session管理)
Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...
- Session管理解决方案笔记
大型网站Session管理解决方案: 1. web服务器之间的session复制. 优点:方案成熟 缺点:复制的性能开销大 2. 减少session使用,使用客户端存储cookie ...
- 使用Memcached Session Manager扩展Session管理
>>Tomcat的session管理 在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中. 然后再从request获取sessi ...
- Tomcat的Session管理机制
>>Session和Cookie请求的过程 Http连接本身是无状态的,即前一次发起的连接跟后一次没有任何关系,是属于两次独立的连接请求,但是互联网访问基本上都是需要有状态的,即服务器需要 ...
随机推荐
- Atcoder Beginner Contest 070 D - Transit Tree Path
题意:n个点,n-1条边,组成一个无向的联通图,然后给出q和k,q次询问,每次给出两个点,问这两个点之间的最短距离但必须经过k点. 思路:我当时是用优化的Dijkstra写的(当天刚学的),求出k点到 ...
- 通过GPLOT过程制作图形
通过GPLOT过程制作图形 和数据报表一样,图形也是展现数据的重要方法,图形的直观效果是数据报表无法替代的.SAS/GRAPH是SAS进行数据可视化展现的重 要组成部分,具有强大的作图功能.可以展现的 ...
- Django项目及应用的创建
一.url解释 1url是全球资源定位符,网上的每个文件都有唯一的url地址,组成:协议.服务器名称(或IP地址).路径和文件名. 2有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,U ...
- Xcode安装CocoaPods
1.虽然Mac自带Ruby但是安装cocoapods需要gem,gem是一个管理Ruby库和程序的标准包,它通过RubyGem源来查找.安装.升级和卸载软件包.因为gem默认的服务器被墙,因此在安装之 ...
- SpringMVC对静态资源的访问(js、css、img)
在网上找了很多的内容,都没法解决,最后通过https://blog.csdn.net/wild46cat/article/details/52456715中内容解决的,在此记录一下. 项目结构: po ...
- Django之路
备注:本套笔记内容来源于互联网,只做学习使用,如有侵权请联系本笔记作者. 资料内容 Django之路(一)——什么是Web开发 Django之路(二)——Django初识 Django之路(三)——U ...
- java日志系统中的 NDC
NDC https://www.cnblogs.com/smile361/p/3853404.html
- [swarthmore cs75] inlab1 — Tiny Compiler
课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了inlab1的实践过程. tiny compiler 这个迷你的编译器可以将一个源文件,编译成可执行的二进制代码. ...
- webstorm验证码
2017-2-16 亲测可用 http://idea.imsxm.com/ webstorm10 注册码 User or company Name: EMBRACE ===== LICENSE KEY ...
- 2019/3/4 java集合学习(二)
java集合学习(二) 在学完ArrayList 和 LinkedList之后,基本已经掌握了最基本的java常用数据结构,但是为了提高程序的效率,还有很多种特点各异的数据结构等着我们去运用,类如可以 ...