一、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. freemarker中对null值问题的处理

    1. freemarker不支持null. 如果值为null会报错. 2.当值为null的处理 1)过滤不显示 Hello ${name!} 在属性后面加感叹号即可过滤null和空字符串 if和”?? ...

  2. python模块——re模块(简单的计算器功能实现_eval版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" # Usage: Make a Diy Calcu ...

  3. Spring Cloud 学习网址

    1. https://blog.csdn.net/forezp/article/details/70148833  史上最简单的 SpringCloud 教程 (非常适合新手快速上手教程)2.http ...

  4. 搭建Eclipse+ADT+Android SDK 安卓开发环境

    安装JDK 请看JDK环境搭建 即可. 安装Eclipse Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运 ...

  5. Jzzhu and Numbers CodeForces - 449D (高维前缀和,容斥)

    大意: 给定集合a, 求a的按位与和等于0的非空子集数. 首先由容斥可以得到 $ans = \sum \limits_{0\le x <2^{20}} (-1)^{\alpha} f_x$, 其 ...

  6. Java字符串 API

    常用API

  7. length,lengthb,substr,substrb,instr小用

    --字符串的字符长度 select length('wm.dfw.士农工商.sda.人马ss.dfw.4.sdf.332.sf.qq.sd') from dual; --字符串的字节长度 select ...

  8. Session的方法getSession() 与 getSession(boolean para)区别

    getSession(boolean para)返回当前http会话,如果不存在,则创建一个新的会话getSession() 调用getSession(true)的简化版 [官方解释] getSess ...

  9. OC MRC之 @property参数(代码分析)

    第一部分 // // main.m // 04-@property参数 // // Created by apple on 13-8-9. // Copyright (c) 2013年 itcast. ...

  10. dup的使用

    转自:http://www.cnblogs.com/GODYCA/archive/2013/01/05/2846197.html 下面是关于实现重定向的函数dup和dup2的解释: 系统调用dup和d ...