Cookie的简介与使用

 
 

Cookie 历来指就着牛奶一起吃的点心。然而,在因特网内,“Cookie”这个字有了完全不同的意思。那么“Cookie”到底是什么呢?“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。当访客结束其浏览器对话时,即终止的所有 Cookie。

Cookie特点

Cookie内存大小受限

IE 6.0 IE 7.0 8.0 Opera Fire Fox Safari Chrome
Cookie个数 每个域名下20个 每个域名下50个 每个域名30个 每个域名50个 没有限制 每个域名53个
Cookie大小 4095字节 4095字节 4096字节 4097字节 4097字节 4097字节

Cookie具有生命周期

    Cookie可以保持登录信息到用户下次与服务器的会话,换句话说,下次访问同一网站时,用户会发现不必输入用户名和密码就已经登录了(当然,不排除用户手工删除Cookie)。而还有一些Cookie在用户退出会话的时候就被删除了,这样可以有效保护个人隐私。

    Cookie在生成时就会被指定一个Expire值,这就是Cookie的生存周期,在这个周期内Cookie有效,超出周期Cookie就会被清除。有些页面将Cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除Cookie,不会记录用户信息,更加安全。

Cookie满足同源策略

虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。

    问题来了 举个例子:

    访问玩zhidao.baidu.com 再访问wenku.baidu.com还需要重新登陆百度账号吗?

    解决办法: 设置document.domain = ‘baidu.com’;    

让页面属于这个基础域名下(那么此页面和任何二级域名为baidu.com的)

封装自己Cookie的增删改查函数

/*
    2017/02/20
    cookie操作
 */function setCookie(key, value, iDay) {
    var oDate = new Date();
    oDate.setDate(oDate.getDate() + iDay);
    document.cookie = key + '=' + value + ';expires=' + oDate;

}function removeCookie(key) {
    setCookie(key, '', -1);//这里只需要把Cookie保质期退回一天便可以删除}function getCookie(key) {
    var cookieArr = document.cookie.split('; ');    for(var i = 0; i < cookieArr.length; i++) {        var arr = cookieArr[i].split('=');        if(arr[0] === key) {            return arr[1];
        }
    }    return false;
}

SpringMVC与Cookie

@CookieValue的作用

用来获取Cookie中的值

@RequestMapping("/testCookie")
public String testCookie(@CookieValue(value="name",required=false) String name,
        @CookieValue(value="age",required=false) Integer age){
    System.out.println(name+","+age);
    return "hello";
}

通过Request操作Cookie

/**  
         * 读取所有cookie  
         * 注意二、从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期  
         * @param request  
         * @param response  
         */  
        @RequestMapping("/showCookies")  
        public void showCookies(HttpServletRequest request,HttpServletResponse response ){  
               
            Cookie[] cookies = request.getCookies();//这样便可以获取一个cookie数组  
            if (null==cookies) {  
                System.out.println("没有cookie=========");  
            } else {  
                for(Cookie cookie : cookies){  
                    System.out.println("name:"+cookie.getName()+",value:"+ cookie.getValue());  
                }  
            }  
               
        }  
        /**  
         * 添加cookie  
         * @param response  
         * @param name  
         * @param value  
         */  
        @RequestMapping("/addCookie")  
        public void addCookie(HttpServletResponse response,String name,String value){  
            Cookie cookie = new Cookie(name.trim(), value.trim());  
            cookie.setMaxAge(30 * 60);// 设置为30min  
            cookie.setPath("/");  
            System.out.println("已添加===============");  
            response.addCookie(cookie);  
        }  
        /**  
         * 修改cookie  
         * @param request  
         * @param response  
         * @param name  
         * @param value  
         * 注意一、修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。  
         */  
        @RequestMapping("/editCookie")  
        public void editCookie(HttpServletRequest request,HttpServletResponse response,String name,String value){  
            Cookie[] cookies = request.getCookies();  
            if (null==cookies) {  
                System.out.println("没有cookie==============");  
            } else {  
                for(Cookie cookie : cookies){  
                    if(cookie.getName().equals(name)){  
                        System.out.println("原值为:"+cookie.getValue());  
                        cookie.setValue(value);  
                        cookie.setPath("/");  
                        cookie.setMaxAge(30 * 60);// 设置为30min  
                        System.out.println("被修改的cookie名字为:"+cookie.getName()+",新值为:"+cookie.getValue());  
                        response.addCookie(cookie);  
                        break;  
                    }  
                }  
            }  
               
        }  
        /**  
         * 删除cookie  
         * @param request  
         * @param response  
         * @param name  
         */  
        @RequestMapping("/delCookie")  
        public void delCookie(HttpServletRequest request,HttpServletResponse response,String name){  
            Cookie[] cookies = request.getCookies();  
            if (null==cookies) {  
                System.out.println("没有cookie==============");  
            } else {  
                for(Cookie cookie : cookies){  
                    if(cookie.getName().equals(name)){  
                        cookie.setValue(null);  
                        cookie.setMaxAge(0);// 立即销毁cookie  
                        cookie.setPath("/");  
                        System.out.println("被删除的cookie名字为:"+cookie.getName());  
                        response.addCookie(cookie);  
                        break;  
                    }  
                }  
            }  
        }




查看原文: http://www.coder306.cn/?p=176

猜你喜欢

转载自blog.csdn.net/belvine/article/details/80058808
今日推荐