一、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. 如何配置Smarty模板

    <?php //首先包含Smarty类文件 include_once('Smarty/Smarty.class.php'); //实例化Smarty类文件 $smarty=new Smarty( ...

  2. GO 和 KEGG 的区别 | GO KEGG数据库用法 | 基因集功能注释 | 代谢通路富集

    一直都搞不清楚这两者的具体区别. 其实初学者搞不清楚很正常,因为它们的本质是相通的,都是对基因进行归类注释的数据库. 建议初学者自己使用一下这两个数据库,应该很快就能明白其中的区别. (抱歉之前没讲清 ...

  3. Android Studio使用Gradle引入包

    方法一 jar包直接复制到lib中右击add as library,等自动构建完成后,打开build.gradle会发现dependencies中多了一个compile file('libs/***. ...

  4. Many Easy Problem

    转自hwk0518,不胜感谢,侵删.

  5. Non-parseable POM 解决方法

     两个build放在一起当然不行,把它们类似这样的合并起来.

  6. Cron\CronExpression::setPart("24")

    利用laravle实现定时器的功能的时候,报错说:Cron\CronExpression::setPart("24"). 后来发现是时间设置的问题,他不能设置("24:0 ...

  7. python-day7-数字类型的内置方法

    #=====>part1:数字类型#掌握:int,float#了解:Long(在python2中才有),complex# num=10# num=int(10)# print(type(num) ...

  8. thinkphp if标签

    1.thinkphp框架中的if标签,用于html页面中.在html中编写php代码 1).从控制器中得到数据在循环中if else 判断:<volist name="system_r ...

  9. POJ 1062 最短路Dijstra

    汉语题... 题意正如你看到的酱... 看的解题报告.思路大概是把每个点看做最高等级.然后枚举所有当前可以访问的点.进行dijstra算法.找到此时到目标点最短路.枚举完之后找到最小的点就可以了. P ...

  10. 快速切题sgu126. Boxes

    126. Boxes time limit per test: 0.25 sec. memory limit per test: 4096 KB There are two boxes. There ...