一、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. 笔试题-sql语句

    今天遇到了不熟练(不会)的查询题目 回来自己又做了一下,如下 建表语句 -- Table structure for score -- ---------------------------- DRO ...

  2. Python获取脚本所在目录的正确方法(转)

    1.以前的方法如果是要获得程序运行的当前目录所在位置,那么可以使用os模块的os.getcwd()函数.如果是要获得当前执行的脚本的所在目录位置,那么需要使用sys模块的sys.path[0]变量或者 ...

  3. LeetCode--111--最长公共前缀

    问题描述: 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null, ...

  4. AC自动机练习

    多模板串匹配一般有两种方法 暴力kmp, 适用于模板串少的情形 直接trie上暴力, 适用于模板串比较短的情形, 并且可以动态插入合并 建立AC自动机, 复杂度是严格线性的, 但不能动态插入 cons ...

  5. hdu4847 kmp

    Chen, Adrian (November 7, 2013). “Doge Is An Ac- tually Good Internet Meme. Wow.”. Gawker. Retrieved ...

  6. python-day43--多表查询

    一.多表连接查询:       #重点:外链接语法 准备表 #建表 create table department( id int, name varchar(20) ); create table ...

  7. 关于floyd 打印路径的问题

    我们令    f[i][j]  表示从 i-->j的最短路上j前面的那个点. 显然初始化时  f[i][j]=i;  (这样的话先判断一下i是否能到达j好点) 更新条件时,当发现通过点k能使最短 ...

  8. Oracle11g温习-第四章:手工建库

     1.create database plan 1.库类型:   OLTP :  在线事务处理系统   OLAP : 在线应用处理系统   DSS :    数据决策系统 2.数据库名字及字符集 3. ...

  9. Android studio jni

    首先我们要明确几个概念,jni,ndk,共享库(.so). jni是java native interface的缩写,java 本地接口.它提供了若干的API实现了Java和其他语言的通信(主要是C/ ...

  10. PHP 的 HTTP 认证机制

    PHP 的 HTTP 认证机制仅在 PHP 以 Apache 模块方式运行时才有效,因此该功能不适用于 CGI 版本.在 Apache 模块的 PHP 脚本中,可以用 header()函数来向客户端浏 ...