• Cookie的简介与使用


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

    Cookie特点

    Cookie内存大小受限

    IE 6.0IE 7.0 8.0OperaFire FoxSafariChrome
    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
  • 相关阅读:
    理解OO 思想 架构好一个程序之基石!~
    WP7 ZIP 压缩与解压缩
    Gis LBS 应用 剧本 (自己乱想的)
    PHP 入门 环境搭建
    Android 入门必须知道的 英文缩写
    Android 开发 数据结构理解 队列和栈 分析及实现
    c函数中形参为引用的情况;C++中*a和*&a的区别
    如何在.NET中使用尾递归
    [ProjectEuler.net] 25 找到第一个fib数,数位为1000位
    NFA_DFA
  • 原文地址:https://www.cnblogs.com/coder306/p/13087685.html
Copyright © 2020-2023  润新知