zoukankan      html  css  js  c++  java
  • JavaScript操作和使用Cookie

    Cookie概述

    Cookie是由服务器端生成并储存在浏览器客户端上的数据。

    在javaweb开发中Cookie被当做java对象在web服务器端创建,并由web服务器发送给特定浏览器客户端,并且web服务器可以向同一个浏览器客户端上同时发送多个Cookie,每一个Cookie对象都由name和value组成,name和value只能是字符串类型,浏览器接收到来自服务器的Cookie数据之后默认将其保存在浏览器缓存中(如果浏览器关闭,缓存消失,Cookie数据消失),只要浏览器不关闭,当我们下一次发送“特定”请求的时候,浏览器负责将Cookie数据发送给web服务器。我们还可以使用特殊的方法,将Cookie保存在客户端的硬盘上。永久性保存。这样关闭浏览器Cookie还是存在的,不会消失,比如:实现两周内自动登录。

    Cookie作用

    Cookie英文意思是小甜品指饼干在电脑术语中简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机。当你在浏览网站的时候,Web服务器会先送一笔小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都记录下来。当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你

    Cookie的使用很普遍,许多提供人化服务的网站,都是利用Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是Web接口的免费E-mail网站,都要用到 Cookie。

    Cookie中记载的资料有限,Cookie是安全的。网站不可能经由Cookie获得你的E-mail地址或是其它私人资料,更没有办法透过Cookie来存取你的计算机。但是如果你实在不喜欢Web服务器乱丢饼干(Cookie)到你家Browser,当然可以让浏览器拒绝网站存放Cookie到你的计算机。只要在IE的“工具”菜单下选择“Intertnet选项”的“安全”,按自定义级别,将Cookie部分设为关闭,按确定,关闭浏览器,再重新启动浏览器即可。当你关闭Cookie之后,很多网站的个人化服务功能很可能也不能再使用了

    Cookie在现实生活中对应的场景

    Cookie在客户端的保存形式和有效时间

    服务器端默认创建的Cookie,发送到浏览器之后,浏览器默认将其保存在缓存中,当浏览器关闭之后Cookie消失。

    服务器创建Cookie对象之后,调用setMaxAge方法设置Cookie的有效时间,

    如果这个有效时间 >0,则该Cookie对象发送给浏览器之后浏览器将其保存到硬盘文件中。

    如果这个有效时间 <0,则该Cookie对象也是被保存在浏览器缓存中,待浏览器关闭Cookie消失。

    如果这个有效时间 =0,则该Cookie从服务器端发过来的时候就已经是一个已过时的Cookie。

    Cookie和请求路径之间的关系

    每一个Cookie和请求路径是绑定在一起的,只有特定的路径才可以发送特定的Cookie。

    实际上浏览器是这样做的:浏览器在向web服务器发送请求的时候先去对应的请求路径下搜索是否有对应的Cookie,如果有Cookie,并且Cookie没有失效,则发送该Cookie或者多个Cookie到服务器端。请求路径和Cookie的关系是这样对应的:

    假如获取Cookie时的路径是 :

      http://127.0.0.1:8080/Demo/getCookie

    将来发送Cookie的路径包括如下路径 :

           http://127.0.0.1:8080/Demo/getCookie(相同路径)

           http://127.0.0.1:8080/Demo/xxxx(同目录)

           http://127.0.0.1:8080/Demo/xxxx/xxxx/xxx(子目录)

    不过我们也可以在创建Cookie对象的时候设置Cookie的关联路径,例如: cookie.setPath(“/Demo/system/login”);  

    那么如下的请求路径浏览器会发送该Cookie:

      http://127.0.0.1:8080/Demo/system/login(相同路径)

      http://127.0.0.1:8080/Demo/system/xxx(同一目录)

      http://127.0.0.1:8080/Demo/system/xxx/xxx(子目录)

    浏览器禁用Cookie

    当浏览器禁用Cookie之后,服务器还是仍然会将Cookie发送给浏览器,只不过这次浏览器选择了不接收。现在有很多网站的使用都是需要开启接收Cookie的。

    Cookie工具类

    java实现对Cookie的操作

    setMaxAge()

    设置cookie经过多少秒后被删除。如果参数是0,就说明立即删除。如果是负数就表明当浏览器关闭时自动删除。如果没有设定cookie的age可以用getMaxAge方法来查看cookie的默认存活时间。

    setPath()

    方法设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分)。

    cookie.setPath("/")

    设置路径,这个路径即该工程下都可以访问该cookie, 如果不设置路径,那么只有设置该cookie时的当前路径及其子路径可以访问。

    cookie.setDomain(".xxx.com")

    这样设置,能实现两个网站共用。

     1 package com.wdxc.util;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 import javax.servlet.http.Cookie;
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 /**
    10  * Cookie工具类
    11  * @author wangbo
    12  *
    13  */
    14 public class CookieUtil {
    15     
    16     /**
    17      * 设置Cookie,将maxAge设为0就是删除Cookie
    18      * @param response
    19      * @param name
    20      * @param value
    21      * @param maxAge 有效期,以秒为单位
    22      */
    23     public static void addCookie(HttpServletResponse response,String name,String value,int maxAge){
    24         Cookie cookie = new Cookie(name,value);
    25         cookie.setPath("/");
    26         cookie.setMaxAge(maxAge);
    27         response.addCookie(cookie);
    28     }
    29     
    30     /**
    31      * 根据名字读取Cookie
    32      * @param request
    33      * @param name
    34      * @return
    35      */
    36     public static String getCookieByName(HttpServletRequest request, String name){
    37         Map<String,Cookie> cookieMap = ReadCookieMap(request);
    38         if(cookieMap.containsKey(name)){
    39             Cookie cookie = (Cookie)cookieMap.get(name);
    40             String value = cookie.getValue();
    41             return value;
    42         }else{
    43             return null;
    44         }   
    45     }
    46     
    47     /**
    48      * 获取所有的Cookie
    49      * @param request
    50      * @return
    51      */
    52     private static Map<String,Cookie> ReadCookieMap(HttpServletRequest request){  
    53         Map<String,Cookie> cookieMap = new HashMap<String,Cookie>();
    54         Cookie[] cookies = request.getCookies();
    55         if(null!=cookies){
    56             for(Cookie cookie : cookies){
    57                 cookieMap.put(cookie.getName(), cookie);
    58             }
    59         }
    60         return cookieMap;
    61     }
    62 }

    JS实现对Cookie的操作

    //写Cookie,默认30天
    function setCookie(name,value){ 
        var days = 30;//此Cookie默认保存30天
        var exp = new Date(); 
        exp.setTime(exp.getTime() + days*24*60*60*1000); 
        document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); 
    } 
    
    //读取Cookie 
    function getCookie(name){ 
        var arr,reg = new RegExp("(^| )"+name+"=([^;]*)(;|$)");
        if(arr = document.cookie.match(reg))
            return unescape(arr[2]); 
        else 
            return null; 
    } 
    
    //删除Cookie 
    function delCookie(name){ 
        var exp = new Date(); 
        exp.setTime(exp.getTime() - 1); 
        var cval = getCookie(name); 
        if(cval != null) 
            document.cookie = name + "="+cval+";expires="+exp.toGMTString(); 
    }
    
    //使用示例 
    setCookie("name","wangbo"); 
    getCookie("name"); 
    //如果需要设定自定义过期时间 ,那么把上面的 setCookie 函数换成下面两个函数就ok; 
    //写Cookie,自定义时间
    function setCookie(name,value,time){ 
        var strsec = getSec(time); 
        var exp = new Date(); 
        exp.setTime(exp.getTime() + strsec*1); 
        document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); 
    }
    
    //解析时间
    //这是有设定过期时间str的使用示例: 
    //s是秒,如20秒则是s20
    //h是小时,如12小时则是h12 
    //d是天数,如30天则是d30 
    function getSec(str){  
        var preStr = str.substring(0,1); 
        var numStr = str.substring(1,str.length)*1; 
        if (preStr=="s"){ 
            return numStr*1000; 
        }else if (preStr=="h"){ 
            return numStr*60*60*1000; 
        }else if (preStr=="d"){ 
            return numStr*24*60*60*1000; 
        } 
    }
    
    //使用示例 
    setCookie("name","wangbo","s20");
  • 相关阅读:
    JVM 常用参数设置(针对 G1GC)
    Java 字符串常量池 及 intern 方法的使用
    JDK 1.8 Metaspace 详解
    JDK 1.8 MetaSpace(元空间)介绍及调优
    Git 统计代码行数
    王永庆传-读书笔记2
    王永庆传-读书笔记1
    董明珠:女人真想干点事,谁也拦不住
    esxi5.5安装nvme驱动
    nvme ssd的一些相关知识点
  • 原文地址:https://www.cnblogs.com/wbxk/p/6837764.html
Copyright © 2011-2022 走看看