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















































  • 相关阅读:
    ZOJ 3332 Strange Country II
    ZOJ 3331 Process the Tasks(双塔DP)
    ZOJ 3326 An Awful Problem(模拟)
    HDU 1796 How many integers can you find(容斥原理)
    HDU 4059 The Boss on Mars(容斥原理)
    HDU 4135 Co-prime(容斥原理)
    HDU 5677 ztr loves substring(回文串加多重背包)
    CodeForces 668B Little Artem and Dance
    CodeForces 667A Pouring Rain
    Java实现 LeetCode 764 最大加号标志(暴力递推)
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6922774.html
Copyright © 2011-2022 走看看