一、HTTP协议的无状态性

WEB应用程序使用的是HTTP协议传输数据的,HTTP协议是一个无状态的协议,这次数据传输完毕,客户端会和服务端断开连接,再次传输数据就需要重新建立新的连接,这也就无法会话跟踪。可以理解为服务器是一个健忘症,这次你访问他和它交换数据,下次来他就不认识你了,这是一个很不友好的事情。这个问题有一个很直接的方法解决它,就是服务器你认识你,你每次都告诉它你的名字,也就是每次客户端访问的时候都需要带上自己的参数,可以采用GET请求每次带上自己的参数,但是这肯定是不可取的,应为GET请求会把参数信息放在浏览器的地址栏中,信息都暴露了,完全保证不了安全性。为了解决HTTP协议这个健忘症患者,cookie和session技术登上了历史舞台。

二、Cookie

既然每次GET请求的时候把数据带上保证安全的,cookie技术把数据放在请求头中了,这样就安全一点了吧。其实也不怎么安全..后面说。cookie技术是一种客户端技术,首先程序给客户端以cookie的形式把数据存放在了浏览器中,这样浏览器再次去请求的时候会带上这个数据,这样浏览器就认识这个请求了。访问过程就是客户端第一次访问服务器的时候浏览器会在响应头中加上Set-Cookie信息,当跳转到另外一个资源的时候也就是再次发送一个请求的时候,请求会在请求头上带上Cookie:xxx,也就是前面自己的数据,目的是让服务器认识自己。

1.cookie的操作

  • 创建cookie对象并添加到响应中

    Cookie cookie = new Cookie(String name,String value);
    response.addCookie(cookie);
  • 从请求中获取cookie中的数据

    Cookie[] cs = request.getCookies();//可以对cs,for-each迭代出每一个cookie对象
    String cookieName = cookie.getName();
    String value = cookie.getValue();
  • 让cookie属性支持中文

    Cookie cookie = new Cookie("cookieName",URLEncoder.encode(username,UTF-8));//创建cookie对象对属性的编码
    String value = URLDecoder.decode(cookie.getValue(),"UTF-8");//获取cookie中的数据对属性的解码
  • 修改cookie中的属性

    //方法1:设置相同名称的key,覆盖上一个,还要把获取的cookie对象添加到响应中去
    Cookie c2 = new Cookie("currentName","HHH");
    resp.addCookie(c2);
    //方法2:调用setValue(); 此时还需要把对象重新加入到响应中
    c.setValue("HHH");
    resp.addCookie(c);
  • 设置cookie的存活时间

    c.setMaxAge(-1); // 设置负数表示-会话cookie,缺省.  浏览器关闭cookie也就消失
    c.setMaxAge(0); // 删除cookie
    c.setMaxAge(10); //持久化cookie,设置cookie可以存活的时间是10s
  • 设置cookie的path

    /**
    * 设置cookie的path为"/",设置整个根路径都可以共享这个cookie,
    * 默认情况是最后一个 / , 例如/cookie/login,只会对cookie/list共享并不会对 /xx/list共享,也就是只共享给以/cookie开始资源
    */
    c.setPath("/");

2.Cookie的缺点

虽然cookie把数据放在了请求头中,但是还是把数据存放在了浏览器中,浏览器都有一个可以查看cookie的选项,显然是有些不安全。另外浏览器和服务器一般会对cookie的大小做限制,还有写中文每次编码解码很麻烦。

三、Session

Cookie技术是把数据存放在了客户端浏览器中,与之相反,Session是把数据存放在了服务器中。session中文意思是会话,服务器为每一次会话创建了一块内存区域来存在数据,第一次请求服务器把数据存放在了服务器中,服务器给客户端响应一个编号,下次再来请求的时候拿着这个编号在服务器的内存空间中可以找到自己的数据。与cookie不同的是,session存放数据的时候是以key-value形式存放,这里的value是Object类型的,而cookie是String类型的。

浏览器第一次请求服务器,服务器会创建cookie对象并且把数据按照key-value的形式起来,然后在响应头中加上Set-Cookie:xxx(这里的xxx其实就是id,好让下一次在可以在服务器中找到),下一次访问的时候,会在请求头中加上Cookie:xxx。其实可以看出,session本质上也是cookie。

需要注意的是:session会在回话结束后消失,也就是关闭浏览器或者关闭服务器session会失效。

1.Session的操作

  • 创建和获取session对象

    第一次请求会创建对象,当再次请求当然就不会再创建了,除非当前会话结束。

    HttpSession session = req.getSession();
    HttpSession session = getSession(boolean create);
    / * true(缺省) : 若当前请求中存在session对象,就直接返回,如果不存在就创建一个再返回
    * false: 若当前请求中存在session对象,就直接返回,如果不存在返回null;
    */
  • 在session中存储数据

    session.setAttribute(String key,Object value);//key的命名一般为大写
  • 取数据

    Object value = session.getAttribute(String key);//根据key,去取value
  • 删除session

     session.removeAttribute(String key);//可以根据key去删除
    session.invalidate();//销毁session对象
  • 超时机制

    //一段时间内浏览器与服务器没有交互会自动销毁session对象
    session.setMaxInactiveInterval(30);//30s

2.session的缺点

session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能。

理解cookie和session技术的更多相关文章

  1. 转:理解Cookie和Session机制

    原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...

  2. 理解Cookie和Session机制

    转载: 理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录 ...

  3. 为什么你学不会递归?告别递归,谈谈我的一些经验 关于集合中一些常考的知识点总结 .net辗转java系列(一)视野 彻底理解cookie,session,token

    为什么你学不会递归?告别递归,谈谈我的一些经验   可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! ...

  4. 基础知识《十二》一篇文章理解Cookie和Session

    理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定 ...

  5. 深入理解Cookie和Session机制

    转载理解Cookie和Session机制 目录 Cookie机制什么是CookieCookie的不可跨域名性Unicode编码:保存中文BASE64编码:保存二进制图片设置Cookie的所有属性Coo ...

  6. 形象地理解Cookie和Session

    Cookie和Session的形象理解 通过实际生活中的银行卡来理解Cookie和Session间的关系: Cookie相当于银行卡 Session相当于银行账户 结合到银行存钱和取钱的过程来理解: ...

  7. 理解cookie,session,token

    彻底理解cookie,session,token 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新 ...

  8. web开发中的Cookie与Session技术

    Cookie Cookie的由来 HTTP协议是无状态的,无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后 ...

  9. [转帖]彻底理解cookie,session,token

    彻底理解cookie,session,token https://www.cnblogs.com/moyand/p/9047978.html 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已 ...

随机推荐

  1. python怎样压缩和解压缩ZIP文件

    https://zhidao.baidu.com/question/1498409764366387259.html

  2. 20170729xlVba SSC_RECENT100

    Public Sub Recent100() Dim WebText As String Dim Reg As Object, Mh As Object, OneMh As Object Dim i ...

  3. Trailing Loves (or L'oeufs?) CodeForces - 1114C (数论)

    大意: 求n!在b进制下末尾0的个数 等价于求n!中有多少因子b, 素数分解一下, 再对求出所有素数的最小因子数就好了 ll n, b; vector<pli> A, res; void ...

  4. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  5. Homebrew cask

    在MacOS中用Homebrew安装软件很方便, 但用 brew install 安装的软件并不会在Launchpad中创建快捷方式, 这很不方便. 所以, 可以用 brew cask install ...

  6. TCP/IP四层与OSI七层模型

      OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行实 ...

  7. iterator not dereferencable问题

    STL中的迭代器总是出现各种问题,这个是我在打表达式求值时碰到的... 综合网上的答案,一般来说有两种情况: 第一:访问了非法位置. 一般来说可能在queue为空时取front(),rear(),或者 ...

  8. Oracle11g温习-第一章 1、ORACLE实例

    2013年4月27日 星期六 10:23 1.ORACLE 实例 System Global Area(SGA) 和 Background Process(后台进程) 称为数据库的实例. 2.ORAC ...

  9. 自定义DateTimeInput(时间)控件的显示格式

    DateTimeInput控件已有的几种格式可以在Format属性中选择: 但这几种格式仍无法满足我的要求怎么办? 例如想将显示格式定为类似这样的格式:2010-06-11 20:02:52,两步搞定 ...

  10. PL/SQL Developer 使用中文条件查询时无数据的解决方法(转)

    原文地址: PL/SQL Developer 使用中文条件查询时无数据的解决方法 PL/SQL Developer 使用中文条件查询时无数据,这是由于字符集的不一致导致的. 执行以下sql命令:sel ...