Làm cách nào để tạo và đọc giá trị từ cookie?


274

Làm cách nào tôi có thể tạo và đọc một giá trị từ cookie trong JavaScript?



FWIW, js-cookie cung cấp API rất tốt để xử lý nó.
Fagner Brack

Bạn có thể kiểm tra hướng dẫn này trên JavaScript Cookie .
Shubham Kumar

Đừng quên rằng API lưu trữ web , có thể là một sự thay thế tốt cho cookie trong một số trường hợp.
MattBianco

Câu trả lời:


234

Dưới đây là các chức năng bạn có thể sử dụng để tạo và truy xuất cookie.

function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else {
        expires = "";
    }
    document.cookie = name + "=" + value + expires + "; path=/";
}

function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) {
                c_end = document.cookie.length;
            }
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}

23
Điều này không hoạt động nếu giá trị cookie của bạn chứa bất cứ thứ gì không mã hóa / giải mã tốt. Một người ở w3school dường như hoạt động rất đẹp
Richard Rout

13
Trình bao bọc đơn giản này của Mozilla cũng có hỗ trợ unicode rõ ràng được đề cập
Brad

4
@BradParks Thật tệ khi nó được phát hành trên GPL.
jahu

1
Điều này sẽ không hoạt động trên IE8 hoặc 9 nếu cookie không có giá trị, vì IE không thêm dấu bằng ( = ) sau tên cookie. Những gì chúng tôi làm là kiểm tra xem indexOf ("=") == - 1 và nếu vậy hãy sử dụng toàn bộ cookie làm tên cookie.
Mohoch

@jahu Và tôi sẽ nói nó cũng thuộc phạm vi công cộng: developer.mozilla.org/en-US/docs/MDN/
Kẻ

51

Cách tiếp cận ES6 tối giản và đầy đủ tính năng:

const setCookie = (name, value, days = 7, path = '/') => {
  const expires = new Date(Date.now() + days * 864e5).toUTCString()
  document.cookie = name + '=' + encodeURIComponent(value) + '; expires=' + expires + '; path=' + path
}

const getCookie = (name) => {
  return document.cookie.split('; ').reduce((r, v) => {
    const parts = v.split('=')
    return parts[0] === name ? decodeURIComponent(parts[1]) : r
  }, '')
}

const deleteCookie = (name, path) => {
  setCookie(name, '', -1, path)
}

2
toGMTString()được phản đối, sử dụng toUTCString()thay thế.
Thanh Nguyễn

@NguyThanh Thx! Đã cập nhật
artnikpro

1
Đôi khi giá trị cookie có thể chứa =dấu hiệu. Trong trường hợp đó chức năng getCookiesẽ tạo ra kết quả bất ngờ. Để tránh điều đó, hãy cân nhắc sử dụng chức năng mũi tên sau đây bên trong cơ thể giảmconst [n, ...val] = v.split('='); return n === name ? decodeURIComponent(val.join('=')) : r
Dmitriy Zhura

Sẽ rất tốt nếu có một tùy chọn để bỏ mặc ngày hết hạn. Điều này sẽ cho phép cookie tự động bị xóa khi thoát khỏi trình duyệt.
xji

4
864e5 = 86400000 = 1000*60*60*24đại diện cho số mili giây trong một ngày 24 giờ.
Henrikh Kantuni

41

Cookie JQuery

hoặc Javascript đơn giản:

function setCookie(c_name,value,exdays)
{
   var exdate=new Date();
   exdate.setDate(exdate.getDate() + exdays);
   var c_value=escape(value) + ((exdays==null) ? "" : ("; expires="+exdate.toUTCString()));
   document.cookie=c_name + "=" + c_value;
}

function getCookie(c_name)
{
   var i,x,y,ARRcookies=document.cookie.split(";");
   for (i=0; i<ARRcookies.length; i++)
   {
      x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
      y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
      x=x.replace(/^\s+|\s+$/g,"");
      if (x==c_name)
      {
        return unescape(y);
      }
   }
}

1
Tôi đánh dấu điều này chủ yếu vì bạn đã đề cập đến JQuery Cookies. Tôi muốn giới thiệu rằng. Mã này rất nhỏ và nếu bạn đã sử dụng JQuery, thì đó chỉ là thứ chính xác để sử dụng.
w0rp

17

Mozilla cung cấp một khung đơn giản để đọc và viết cookie với sự hỗ trợ unicode đầy đủ cùng với các ví dụ về cách sử dụng nó.

Khi được đưa vào trang, bạn có thể đặt cookie:

docCookies.setItem(name, value);

đọc một cái bánh quy

docCookies.getItem(name);

hoặc xóa cookie:

docCookies.removeItem(name);

Ví dụ:

// sets a cookie called 'myCookie' with value 'Chocolate Chip'
docCookies.setItem('myCookie', 'Chocolate Chip');

// reads the value of a cookie called 'myCookie' and assigns to variable
var myCookie = docCookies.getItem('myCookie');

// removes the cookie called 'myCookie'
docCookies.removeItem('myCookie');

Xem thêm ví dụ và chi tiết trên trang document.cookie của Mozilla .

Một phiên bản của tệp js đơn giản này có trên github .


2
Xin lưu ý rằng thư viện cookie được cung cấp trên MDN được phát hành theo GPL, không phải LGPL.
Tất cả công nhân là cần thiết

Tôi cần nhập tệp javascript nào? Không thể tìm thấy nó :(
AlikElzin-kilaka

Xem phần bên dưới "Thư viện" trên trang này: developer.mozilla.org/en-US/docs/Web/API/document/ trộm - bạn có thể lưu nó vào một tệp và đưa nó vào hoặc dán vào tệp js hiện có bạn muốn sử dụng nó
Brendan Nee

Vì vậy, không có tập tin javascript độc lập? Vì vậy, đó là một đoạn mã - không phải là một thư viện thực tế.
AlikElzin-kilaka

Đầu vào tuyệt vời! "Thư viện" là một tệp .js duy nhất có ~ 80 dòng; đây là tệp này (trên GitHub): github.com/madmurphy/cookies.js/blob/master/cookies.js
Philipp

8

ES7, sử dụng biểu thức chính quy cho get (). Dựa trên MDN

const Cookie =
    { get: name => {
        let c = document.cookie.match(`(?:(?:^|.*; *)${name} *= *([^;]*).*$)|^.*$`)[1]
        if (c) return decodeURIComponent(c)
        }
    , set: (name, value, opts = {}) => { 
        if (opts.days) { 
            opts['max-age'] = opts.days * 60 * 60 * 24; 
            delete opts.days 
            }
        opts = Object.entries(opts).reduce((str, [k, v]) => `${str}; ${k}=${v}`, '')
        document.cookie = name + '=' + encodeURIComponent(value) + opts
        }
    , delete: (name, opts) => Cookie.set(name, '', {'max-age': -1, ...opts}) 
    // path & domain must match cookie being deleted 
    }

Cookie.set('user', 'Jim', {path: '/', days: 10}) 
// Set the path to top level (instead of page) and expiration to 10 days (instead of session)

Cách sử dụng - Cookie.get (tên, giá trị [, tùy chọn]):
tùy chọn hỗ trợ tất cả các tùy chọn cookie tiêu chuẩn và thêm "ngày":

  • đường dẫn : '/' - bất kỳ đường dẫn tuyệt đối. Mặc định : vị trí tài liệu hiện tại,
  • tên miền : 'sub.example.com' - có thể không bắt đầu bằng dấu chấm. Mặc định : máy chủ hiện tại không có tên miền phụ.
  • an toàn : đúng - Chỉ phục vụ cookie qua https. Mặc định : sai.
  • ngày : 2 - ngày cho đến khi cookie hết hạn. Mặc định : Kết thúc phiên.
    Các cách khác để thiết lập hết hạn:
    • hết hạn : 'Chủ nhật, ngày 18 tháng 2 năm 2018 16:23:42 GMT' - ngày hết hạn dưới dạng chuỗi GMT.
      Ngày hiện tại có thể được nhận với: Ngày mới (Date.now ()). ToUTCString ()
    • 'Tuổi tối đa' : 30 - giống như ngày, nhưng tính bằng giây thay vì ngày.

Các câu trả lời khác sử dụng "hết hạn" thay vì "tối đa" để hỗ trợ các phiên bản IE cũ hơn. Phương pháp này yêu cầu ES7, vì vậy IE7 không có vấn đề gì (đây không phải là vấn đề lớn).

Lưu ý: Các ký tự vui như "=" và "{:}" được hỗ trợ dưới dạng giá trị cookie và regex xử lý khoảng trắng hàng đầu và dấu (từ các lib khác).
Nếu bạn muốn lưu trữ các đối tượng, hãy mã hóa chúng trước và sau bằng và JSON.opesify và JSON.parse, chỉnh sửa phần trên hoặc thêm phương thức khác. Ví dụ:

Cookie.getJSON = name => JSON.parse(Cookie.get(name))
Cookie.setJSON = (name, value, opts) => Cookie.set(name, JSON.stringify(value), opts);

Các downvoters vui lòng giải thích những gì sai với phương pháp của tôi?
Samoody

1
1. Ngắn hơn và IMO dễ bảo trì hơn. 2. Hoàn thiện hơn (là câu trả lời duy nhất để chấp nhận an toàn, mọi thứ tự lập luận, tuổi tối đa). 3. Mặc định tiêu chuẩn hơn (đường dẫn vv mặc định theo tiêu chuẩn, không giống như hầu hết các câu trả lời ở đây). 4. Thực tiễn tốt nhất (theo MDN, regex là cách đáng tin cậy nhất để trích xuất các giá trị). 5. Futureprook (nếu có thêm tùy chọn được thêm vào cookie, chúng sẽ được duy trì). 6. Một đối tượng làm ô nhiễm mã ít hơn một loạt các hàm. 7. Nhận, thiết lập và xóa và dễ dàng để thêm nhiều phương thức. 8. ES7 (buzzwords ngon).
Samoody

7

Đối với những người cần lưu các đối tượng như {foo: 'bar'}, tôi chia sẻ phiên bản chỉnh sửa của câu trả lời @ KevinBurke. Tôi đã thêm JSON.opesify và JSON.parse, chỉ vậy thôi.

cookie = {

    set: function (name, value, days) {
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            var expires = "; expires=" + date.toGMTString();
        }
        else
            var expires = "";
        document.cookie = name + "=" + JSON.stringify(value) + expires + "; path=/";
    },

    get : function(name){
        var nameEQ = name + "=",
            ca = document.cookie.split(';');

        for(var i=0;i < ca.length;i++) {
          var c = ca[i];
          while (c.charAt(0)==' ') c = c.substring(1,c.length);
            if (c.indexOf(nameEQ) == 0) 
              return  JSON.parse(c.substring(nameEQ.length,c.length));
        }

        return null;
    }

}

Vì vậy, bây giờ bạn có thể làm những việc như thế này:

cookie.set('cookie_key', {foo: 'bar'}, 30);

cookie.get('cookie_key'); // {foo: 'bar'}

cookie.set('cookie_key', 'baz', 30);

cookie.get('cookie_key'); // 'baz'

5

Tôi đã sử dụng câu trả lời được chấp nhận của chủ đề này nhiều lần rồi. Đó là một đoạn mã tuyệt vời: Đơn giản và có thể sử dụng được. Nhưng tôi thường sử dụng babel và ES6 và các mô-đun, vì vậy nếu bạn giống tôi, đây là mã để sao chép để phát triển nhanh hơn với ES6

Câu trả lời được chấp nhận viết lại dưới dạng mô-đun với ES6:

export const createCookie = ({name, value, days}) => {
  let expires;
  if (days) {
    let date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    expires = '; expires=' + date.toGMTString();
  } else {
    expires = '';
  }
  document.cookie = name + '=' + value + expires + '; path=/';
};

export const getCookie = ({name}) => {
  if (document.cookie.length > 0) {
    let c_start = document.cookie.indexOf(name + '=');
    if (c_start !== -1) {
      c_start = c_start + name.length + 1;
      let c_end = document.cookie.indexOf(';', c_start);
      if (c_end === -1) {
        c_end = document.cookie.length;
      }
      return unescape(document.cookie.substring(c_start, c_end));
    }
  }
  return '';
};

Và sau này, bạn có thể chỉ cần nhập nó dưới dạng bất kỳ mô-đun nào (đường dẫn của khóa học có thể thay đổi):

import {createCookie, getCookie} from './../helpers/Cookie';

5

Đây là mã để Nhận, Đặt và Xóa Cookie trong JavaScript .

function getCookie(name) {
    name = name + "=";
    var cookies = document.cookie.split(';');
    for(var i = 0; i <cookies.length; i++) {
        var cookie = cookies[i];
        while (cookie.charAt(0)==' ') {
            cookie = cookie.substring(1);
        }
        if (cookie.indexOf(name) == 0) {
            return cookie.substring(name.length,cookie.length);
        }
    }
    return "";
}

function setCookie(name, value, expirydays) {
 var d = new Date();
 d.setTime(d.getTime() + (expirydays*24*60*60*1000));
 var expires = "expires="+ d.toUTCString();
 document.cookie = name + "=" + value + "; " + expires;
}

function deleteCookie(name){
  setCookie(name,"",-1);
}

Nguồn: http://mycodingtricks.com/snippets/javascript/javascript-cookies/


2

Tôi sử dụng đối tượng này. Các giá trị được mã hóa, vì vậy cần phải xem xét nó khi đọc hoặc viết từ phía máy chủ.

cookie = (function() {

/**
 * Sets a cookie value. seconds parameter is optional
 */
var set = function(name, value, seconds) {
    var expires = seconds ? '; expires=' + new Date(new Date().getTime() + seconds * 1000).toGMTString() : '';
    document.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/';
};

var map = function() {
    var map = {};
    var kvs = document.cookie.split('; ');
    for (var i = 0; i < kvs.length; i++) {
        var kv = kvs[i].split('=');
        map[kv[0]] = decodeURIComponent(kv[1]);
    }
    return map;
};

var get = function(name) {
    return map()[name];
};

var remove = function(name) {
    set(name, '', -1);
};

return {
    set: set,
    get: get,
    remove: remove,
    map: map
};

})();

0

Cách đơn giản để đọc cookie trong ES6.

function getCookies() {
    var cookies = {};
    for (let cookie of document.cookie.split('; ')) {
        let [name, value] = cookie.split("=");
        cookies[name] = decodeURIComponent(value);
    }
    console.dir(cookies);
}

0

Tôi đã sử dụng js-cookie để thành công.

<script src="/path/to/js.cookie.js"></script>
<script>
  Cookies.set('foo', 'bar');
  Cookies.get('foo');
</script>

0

Bạn có thể sử dụng mô-đun ES cookie của tôi để nhận / đặt / xóa cookie.

Sử dụng:

Trong thẻ đầu của bạn, bao gồm mã sau đây:

<script src="https://raw.githack.com/anhr/cookieNodeJS/master/build/cookie.js"></script>

hoặc là

<script src="https://raw.githack.com/anhr/cookieNodeJS/master/build/cookie.min.js"></script>

Bây giờ bạn có thể sử dụng window.cookie để lưu trữ thông tin người dùng trong các trang web.

cookie.isEnables ()

Là cookie được kích hoạt trong trình duyệt web của bạn?

returns {boolean} true if cookie enabled.

Thí dụ

if ( cookie.isEnabled() )
    console.log('cookie is enabled on your browser');
else
    console.error('cookie is disabled on your browser');

cookie.set (tên, giá trị)

Đặt một cookie.

name: cookie name.
value: cookie value.

Thí dụ

cookie.set('age', 25);

cookie.get (tên [, defaultValue]);

lấy một cái bánh quy

name: cookie name.
defaultValue: cookie default value. Default is undefined.
returns cookie value or defaultValue if cookie was not found
Thí dụ
var age = cookie.get('age', 25);

cookie.remove (tên);

Xóa cookie.

name: cookie name.
Thí dụ
cookie.remove( 'age' );

Ví dụ về cách sử dụng


-1

Một phiên bản cải tiến của readCookie:

function readCookie( name )
{
    var cookieParts = document.cookie.split( ';' )
    ,   i           = 0
    ,   part
    ,   part_data
    ,   value
    ;

    while( part = cookieParts[ i++ ] )
    {
        part_data = part.split( '=' );

        if ( part_data.shift().replace(/\s/, '' ) === name )
        {
            value = part_data.shift();
            break;
        }

    }
    return value;
}

Điều này sẽ phá vỡ ngay khi bạn tìm thấy giá trị cookie của mình và trả về giá trị của nó. Theo tôi rất thanh lịch với sự chia đôi.

Thay thế trên điều kiện if là một khoảng trắng, để đảm bảo nó khớp chính xác


-1
function setCookie(cname,cvalue,exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires=" + d.toGMTString();
    document.cookie = cname+"="+cvalue+"; "+expires;
}

function getCookie(cname) {
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i<ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1);
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function checkCookie() {
    var user=getCookie("username");
    if (user != "") {
        alert("Welcome again " + user);
    } else {
       user = prompt("Please enter your name:","");
       if (user != "" && user != null) {
           setCookie("username", user, 30);
       }
    }
}

-1

Tôi đã viết cookieUtils đơn giản, nó có ba chức năng để tạo cookie, đọc cookie và xóa cookie.

var CookieUtils = {
    createCookie: function (name, value, expireTime) {
        expireTime = !!expireTime ? expireTime : (15 * 60 * 1000); // Default 15 min
        var date = new Date();
        date.setTime(date.getTime() + expireTime);
        var expires = "; expires=" + date.toGMTString();
        document.cookie = name + "=" + value + expires + "; path=/";
    },
    getCookie: function (name) {
        var value = "; " + document.cookie;
        var parts = value.split("; " + name + "=");
        if (parts.length == 2) {
            return parts.pop().split(";").shift();
        }
    },
    deleteCookie: function(name) {
        document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
    }
};

-1

Dưới đây là ví dụ từ w3chools đã được đề cập.

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+ d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

function getCookie(cname) {
    var name = cname + "=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    for(var i = 0; i <ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

-1

Một cách đọc đơn giản

var getCookie = function (name) {
    var valueStart = document.cookie.indexOf(name + "=") + name.length + 1;
    var valueEnd = document.cookie.indexOf(";", valueStart); 
    return document.cookie.slice(valueStart, valueEnd)
}

-2

Một cách đơn giản và đơn giản để đọc cookie có thể là một cái gì đó như:

let username, id; 
eval(document.cookie); 
console.log(username + ", " + id); // John Doe, 123

Điều này có thể được sử dụng nếu bạn biết cookie của bạn có chứa một cái gì đó như : username="John Doe"; id=123;. Lưu ý rằng một chuỗi sẽ cần dấu ngoặc kép trong cookie. Không phải là cách được đề xuất có thể, nhưng hoạt động để thử nghiệm / học tập.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.