zoukankan      html  css  js  c++  java
  • 深入理解cookie与session

           cookie和session是web开发比較基础也比較重要的知识,cookie和session用于用户的状态管理。简单的来说它们都仅仅是http中的一个配置项,在Servlet规范中也仅仅相应一个类而已。http对cookie的数量和大小有限制,而session不易于在非常多的server中进行共享。

          Session与Cookie的作用都是为了保持訪问用户与后端server的交互状态。

    他们有各自的长处和缺陷。但一个server訪问量非常大的时候,比方一天又几亿个pv,假如每一个cookie占用200个字节。那么它须要多少带宽了。所以訪问量大的时候希望使用session。可是session的致命弱点是不easy在多台server之间共享。这也限制了session的使用。





















    以上的这些资料来自阿里的java web技术内幕


          为了解决cookie和session的缺陷,并结合他们的优势,利用session的分布式框架。能够节省带宽。和解决session的同步问题,详细的能够參考阿里内部技术资料java web技术内幕。


    1.状态管理
    server对用户訪问的状态进行管理
    http请求是一次性请求,但同一用户可能会通过http协议向server发送多次请求
    用了管理用户多次请求(登录開始到退出为止,中间多次请求操作为同一用户),此时
    须要对用户进行状态管理
    状体管理的两种方式:
    1.在client保存数据管理状态(cookie)
    2.在server端保存数据管理状态(session)

    2.session
    用户首次訪问server,server会为每一个用户单独创建一个session对象(HttpSession),
    并为每一个session分配唯一一个id(sessionId),sessionId通过cookie保存到用户端。

    当用户再次訪问server时,需将相应的sessionId携带给server,server通过这个唯一
    sessionId就能够找到用户相应的session对象,从而达到管理用户状态
    1.获得session对象
    a.request.getSession(flag);
    当flag=true时,server会查找用户是否用sessionId,假设sessionId为Null,
    则server会创建一个新的session对象返回给用户(sessionId)
    假设sessionId存在,则会依据相应的sessionId去查找session对象。假设session
    对象存在则直接返回。假设不存在则创建新的session对象并返回。


    当flag=false;server会查找用户是否用sessionId,假设sessionId为Null,则返回
    为null,假设sessionId,则会依据相应的sessionId去查找session对象。假设session
    对象存在则直接返回,假设不存在则返回为Null。
    b.request.getSession();
    等效于request.getSession(true);
    2.session经常使用API
    存:session.setAttribute(key,value);
    取:session.getAttribute(key);
    删除:session.removeAttribute(key);


    -------------------------------------------------------
    1.状态管理
    前提:http协议请求是一次性请求。但在通常情况下又须要记住用户,管理用户状态
    2.状态管理方式方法
    1.client保存数据(Cookie)
    2.server端(Session)
    3.session
    由于用户首次訪问,server会检查sessionId没有则创建session对象,并将对象的sessionId
    发送给用户(response对象。以cookie方式),当用户再次訪问。须要携带相应的sessionId
    (request对象,以cookide方式)。server会检查相应sessionId,存在则查找相应的session对象
    并返回给用户。假设sessionId存在而相应session对象不存在,server会创建新的session对象并
    将这个新得到sessionId返回给用户。
    4.session的API
    a.HttpSession session=request.getSession(true/false);
    b.HttpSession session=request.getSession();
    public static HttpSession getSession(){
    return getSession(true);
    }
    //重载的方法之间常常重用
    比如:点与圆之间的距离
    class Circle{
    double getDistance(int x,int y){
    return Math.sqrt((this.x-x)(this.x-x)-(this.y-y)(this.y-y));
    }
    double getDistance(Point p){
    return getDistance(p.getX(),p.getY());
    }
    }
    c.session.setAttribute(key,value);
    d.session.getAttribute(key);-value(Object)
    e.session.removeAttribute(key);
    f.session.getSessionId();
    【练习】使用session记录用户的訪问次数
    5.session的有效期
    全部用户的session对象都保存在server,则server空间有限,全部不能永久保存session
    即sesion对象在server中保存的有效时间
      设置session有效期:
      1.//设置session有效期
    session.setMaxInactiveInterval(15);
    2.server设置
    <session-config>
           <session-timeout>30</session-timeout>
       </session-config>
    3.在servlet相应的web.xml中配置
    6.踢出session
    session.invalidate();
    7.Session失效
    禁用cookie会导致session失效
    原理:client无法保存server发送的sessionId,所以訪问时没有sessionId,那么依据
    session创建原理。server会创建新的session对象返回给用户
    解决方案:URL重写


    原文:http://blog.csdn.net/j903829182/article/details/39855221















































  • 相关阅读:
    015_stdc_C语言
    014_stdc_C语言
    013_stdc_C语言
    012C语言
    011_stdc_C语言
    010_stdc_C语言
    009_stdc_C语言
    008_stdc_C语言
    40.委托
    39.多线程
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6922774.html
Copyright © 2011-2022 走看看