zoukankan      html  css  js  c++  java
  • ②萨克斯,音符的悠扬(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/

  • 相关阅读:
    解决粘包问题
    粘包问题
    模拟ssh功能
    套接字接上链接循环
    套接字加入通讯循环
    简单通信
    网络编程
    单例模式
    记录一下:chrome上,把网页保存为文件的插件
    centos6.5 64bit 实现root开机自动登录X桌面
  • 原文地址:https://www.cnblogs.com/Alandre/p/3586182.html
Copyright © 2011-2022 走看看