一.前言

  小朽不才,最近喜欢上了萨克斯,一年计划[传送门]中的实行。就伴随着一首萨克斯,整理了下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管理)的更多相关文章

  1. Nhibernate的Session管理

    参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...

  2. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...

  3. ABP(现代ASP.NET样板开发框架)系列之7、ABP Session管理

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之7.ABP Session管理 ABP是“ASP.NET Boilerplate Project (ASP.NET ...

  4. 2016-1-30 Servlet中Session管理(Sesssion追踪)

    Session管理(Sesssion追踪)是Web应用程序开发中非常重要的一个主题.这是因为HTTP是无状态的,在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的 ...

  5. Redis3.2+Tomcat实现集群的Session管理 -- tomcat-redis-session-manager的编译和开发部署环境搭建

    已经有不少文章介绍使用tomcat-redis-session-manager来实现Redis存储Tomcat的Session,实现分布式Session管理.但是现在官方编译的tomcat-redis ...

  6. tomcat架构分析 (Session管理)

    Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...

  7. Session管理解决方案笔记

    大型网站Session管理解决方案: 1. web服务器之间的session复制.    优点:方案成熟    缺点:复制的性能开销大 2. 减少session使用,使用客户端存储cookie     ...

  8. 使用Memcached Session Manager扩展Session管理

    >>Tomcat的session管理 在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中. 然后再从request获取sessi ...

  9. Tomcat的Session管理机制

    >>Session和Cookie请求的过程 Http连接本身是无状态的,即前一次发起的连接跟后一次没有任何关系,是属于两次独立的连接请求,但是互联网访问基本上都是需要有状态的,即服务器需要 ...

随机推荐

  1. java中的值传递和引用传递有什么区别呀?

    值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...

  2. android6.0以上权限动态申请,有视频链接可以看效果。

    android6.0以上某些权限需要动态申请,虽然现在大多的手机系统版本在6.0,但是升级到6.0及以上是迟早的事,所以如何能够更好的控制动态申请权限时能有好的提示用户,及给用户带去更好的体验,是需要 ...

  3. python实现异步调用函数

    import time from concurrent.futures import ThreadPoolExecutor def RunBenchmark(url): print('GET %s' ...

  4. Mybatis第二天

    Mybatis第二天   框架课程 1. 课程计划 1.输入映射和输出映射 a) 输入参数映射 b) 返回值映射 2.动态sql a) If标签 b) Where标签 c) Sql片段 d) Fore ...

  5. CodeForces 935E Fafa and Ancient Mathematics (树形DP)

    题意:给定一个表达式,然后让你添加 n 个加号,m 个减号,使得表达式的值最大. 析:首先先要建立一个表达式树,这个应该很好建立,就不说了,dp[u][i][0] 表示 u 这个部分表达式,添加 i ...

  6. intent和手势探测

    一.三种启动方法 setComponent ComponentName comp = new ComponentName( this, SecondActivity.class); Intent in ...

  7. Pip无法卸载某些包:Cannot uninstall 'PyYAML'.

    查找了很多资料,最终还是手动删除吧: 注意如果你有火萤酱或everything等外部索引的,来搜索如图PyYAML的进行删除,可能删不干净 建议最后在你的anaconda路径下或者python路径下在 ...

  8. spark配置参数

    ~/.bashrc export SPARK_HOME=/usr/local/spark export PATH=$PATH:$SPARK_HOME/bin /usr/local/spark/conf ...

  9. Maven package 报错解决记录以及编译scala的pom.xml

    可以打包的pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...

  10. Openvswitch手册(3): sFlow, netFlow

    这一节,我们重点看sFlow 采样流sFlow(Sampled Flow)是一种基于报文采样的网络流量监控技术,主要用于对网络流量进行统计分析. sFlow系统包含一个嵌入在设备中的sFlow Age ...