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);
}

猜你喜欢

转载自www.cnblogs.com/sensenma533/p/10666865.html