zoukankan      html  css  js  c++  java
  • COOKIE和SESSION之间的区别以及用法

    一、Session简单介绍

      在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

    二、Cookie简单介绍

    “Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。当访客结束其浏览器对话时,即终止的所有 Cookie。

    三、Session和Cookie的主要区别

    1,session 在服务器端,cookie 在客户端(浏览器)
    2,session 默认被存在在服务器的一个文件里(不是内存)
    3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
    4,session 可以放在 文件、数据库、或内存中都可以。
    5,用户验证这种场合一般会用 session

    因此,维持一个会话的核心就是客户端的唯一标识,即 session id

    四、Session和Cookie的用法

    Session:

    1、设置session的标记

    <span style="white-space:pre">        </span>//在把user对象放入session中,有了标记,这点儿很重要。
            request.getSession().setAttribute("user", user);//前者是标记名字,后者是对象

    2、得到session,名字必须和设置的标记名一样

    <span style="white-space:pre">        </span>//得到session中的session验证码
            String sessuoncode=(String)request.getSession().getAttribute("user");

    3、关闭sesion与对象的关联或者直接销毁session

            request.getSession().removeAttribute("user");//删除了域中绑定的对象
    //        request.getSession().invalidate();//这是直接销毁session,可任选一种

    注:session的缓存时间(有三种方式,建议使用默认或者实现接口,implements Serializable)

    <span style="white-space:pre">    </span>//session.setMaxInactiveInterval(2);
        //setMaxInactiveInterval表示2秒内不对session做出操作,自动删除session
        //一般情况下,不用设置这个函数,因为getMaxInactiveInterval()的session的默认失效为1800毫秒也就是半分钟
        //System.out.println(session.getMaxInactiveInterval());//打印默认session存在时间

    Cookie:

    response.addCookie(Cookie cookie)是将一个cookie对象传入客户端。

                  Cookie cookie=new Cookie(String name,String value):构造一个cookie对象

                  request.getCookies():得到所有的cookie对象

                 cookie.getName():得到此cookie对象的名字

                 cookie.getValue(String name):得到对应名称的cookie的值

    1.在使用cookie的时候,首先要注意浏览器是否支持cookie,可以用过设置浏览器,使其支持使用cookie

    2.如果要使cookie保存中文的信息,需要使用java.net.URLEncoder类的encode方法进行编码,需要使用java.net.URLDecoder的decode方法进行解码。 这种方法和String类的编码和解码类似,String的编码方法是byte[] b=str.getBytes();//这是使用本地默认的编码格式进行编码,或者是byte[] b=str.getBytes("utf-8");//这种是以utf-8的方式进行解码,也可以使用其他的类型。我们要用同一种编码格式进行解码和编码,不然有可能会出现乱码问题,这种编码和解码的方式也可以解决get方式乱码问题。

    cookie的几种常见属性:document.cookie="key=value;expires=失效时间;path=路径;domain=域名;secure;(secure表安全级别),cookie以字符串的形式保存在浏览器中。

    3、封装的cookie的存入,读取以及删除的函数:(这里是将信息以对象的形式存放到cookie中的,会用到JSON的知识)

    // key : cookie 名
    // value : cookie 值
    // options : 可选配置参数
    //        options = {
    //            expires : 7|new Date(), // 失效时间
    //            path : "/", // 路径
    //            domain : "", // 域名
    //            secure : true // 安全连接
    //        }
    function cookie(key, value, options) {
        /* read 读取 */
        // 如果没有传递 value ,则表示根据 key 读取 cookie 值
        if (typeof value === "undefined") { // 读取
            // 获取当前域下所有的 cookie,保存到 cookies 数组中
            var cookies = document.cookie.split("; ");
            // 遍历 cookies 数组中的每个元素
            for (var i = 0, len = cookies.length; i < len; i++) {
                // cookies[i] : 当前遍历到的元素,代表的是 "key=value" 意思的字符串,
                // 将字符串以 = 号分割返回的数组中第一个元素表示 key,
                // 第二个元素表示 value
                var cookie = cookies[i].split("=");
                // 判断是否是要查找的 key,对查找的 key 、value 都要做解码操作
                if (decodeURIComponent(cookie[0]) === key) {
                    return decodeURIComponent(cookie[1]);
                }
            }
            // 没有查找到指定的 key 对应的 value 值,则返回 null
            return null;
        }
     
        /* 存入 设置 */
        // 设置 options 默认为空对象
        options = options || {};
        // key = value,对象 key,value 编码
        var cookie = encodeURIComponent(key) + "=" + encodeURIComponent(value);
        // 失效时间
        if ((typeof options.expires) !== "undefined") { // 有配置失效时间
            if (typeof options.expires === "number") { // 失效时间为数字
                var days = options.expires, 
                    t = options.expires = new Date();
                t.setDate(t.getDate() + days);
            } 
            cookie += ";expires=" + options.expires.toUTCString();
        }
        // 路径
        if (typeof options.path !== "undefined")
            cookie += ";path=" + options.path;
        // 域名
        if (typeof options.domain !== "undefined")
            cookie += ";domain=" + options.domain;
        // 安全连接
        if (options.secure)
            cookie += ";secure";
     
        // 保存
        document.cookie = cookie;
    }
     
    // 从所有的 cookie 中删除指定的 cookie
    function removeCookie(key, options) {
        options = options || {};
        options.expires = -1; // 将失效时间设置为 1 天前
        cookie(key, "", options);
    }
  • 相关阅读:
    使用片段嵌入进行文档搜索
    详解支持向量机
    使用NLP检测和对抗AI生成的假新闻
    Detectron2 API 之 config | 十五
    用Python可视化卷积神经网络
    六种用于文本分类的开源预训练模型
    解空间树(回溯算法,分支界限法)
    日记2
    C编程(C语言程序设计,大连理工大学MOOC)
    编程题(C/C++程序设计,同济大学mooc)
  • 原文地址:https://www.cnblogs.com/sensenma533/p/10666865.html
Copyright © 2011-2022 走看看