>웹 프론트엔드 >JS 튜토리얼 >자바스크립트 및 쿠키 문제에 대한 자세한 설명_javascript 기술

자바스크립트 및 쿠키 문제에 대한 자세한 설명_javascript 기술

WBOY
WBOY원래의
2016-05-16 17:16:22885검색

JS를 사용하여 쿠키를 읽고 쓸 때 문제에 주의를 기울이지 않은 것으로 나타났습니다.
동일한 키 값으로 다른 도메인(locahost.dev.xxx.com, dev.xxx.com, xxx) .com 등)이 동시에 존재할 수 있는데, document.cookie는 이러한 쿠키를 모두 읽을 수 있지만, 쿠키의 도메인 정보를 읽을 수 있는 방법도 찾아보았습니다. 아쉽게도 못찾았습니다.(모르겠습니다.) 도메인 정보를 읽을 수 있는 방법이 있나요? 그렇다면 알려주세요.)
이 문제가 발생하는 시나리오:
에서 처음에는 로컬(localhost.dev.xxx.com)과 dev(dev.xxx.com) 및 uat(xxx.com) 환경의 쿠키가 서로 영향을 미치지 않도록 만들고 싶었습니다. 나는 cookieDomain

을 생성했습니다. location.hostname을 기반으로 합니다.

1 var cookieDomain = document.domain; 2 3 var tmp = location.hostname.split(.) 4 5 if(tmp.length > 2)6 7 cookieDomain = tmp.slice(1).join(. );
쿠키를 작성할 때 도메인을 이 cookieDomain으로 설정했습니다. 이렇게 하면 서로 다른 환경의 쿠키가 서로 다른 도메인에 기록되어 서로 영향을 주지 않는 것 같습니다.
하지만 이때 가져올 때는 다음과 같은 작업을 수행할 수 있습니다. 같은 키로 N개의 쿠키 값을 꺼내고, 처음 나오는 쿠키만 가져가니까, 꺼낸 값이 틀릴 가능성이 높아요. 피부 반창고를 멈춰주세요! 외부 세계에 하나의 URL만 제공하면 방문자의 컴퓨터에는 값 오류가 발생하지 않는다고 N번 설명했습니다. 하지만 매번 버그가 발생합니다. 요약 이 문제는 항상 나열하겠습니다! 모든 설명은 피아노 연주와 같습니다.
Mu Zhe 그러면 이 사람들을 구하기 위해 js로 작성된 모든 쿠키를 루트 도메인 이름에 기록하겠습니다. 큰 문제에 신경쓰지 말고 작은 도둑, 말보다 수레를 앞세우세요!

코드를 복사하세요. 코드는 다음과 같습니다.

(function(){

    // 清除旧版本的 cookie
    if(CTSZ.Cookie.get("cookieVersion") != Params.cookieVersion){
        var tmps = Params.orgDomain.split(.);
        var domain;
        var len = tmps.length;
        for(var i=0;i<= len - 3; i++){
tmps.shift();
domain = tmps.join(.);
CTSZ.Cookie.empty("/", domain);
}
CTSZ.Cookie.set("cookieVersion", Params.cookieVersion, Params.cookieExpires, "/", Params.cookieDomain);
}
})();

$.Cookie = {};
(function ($) {
$.getExpires = function (y, m, d, h, i, s, ms) {
var date = new Date();
y = isNaN(y) ? date.getFullYear() : y;
m = isNaN(m) ? date.getMonth() : m - 1;
d = isNaN(d) ? date.getDate() : d;
h = isNaN(h) ? date.getHours() : h;
i = isNaN(i) ? date.getMinutes() : i;
s = isNaN(s) ? date.getSeconds() : s;
ms = isNaN(ms) ? date.getMilliseconds() : ms;
return new Date(y, m, d, h, i, s, ms).toUTCString();
}
$.getExpiresByUTCString = function (UTCString) {
var s = new Date(UTCString).toUTCString();
if (s == NaN || s == Invalid Date)
return null; // IE,Opera NaN , FF,Safari Invalid Date;
else
return s;
}

$.set = function (k, v, expires, path, domain, secure) {
var cookie = k + = + encodeURIComponent(v);
if (expires) cookie += ";expires=" + expires;
if (path) cookie += ";path=" + path;
if (domain) cookie += ";domain=" + domain;
if (secure) cookie += ";secure";
document.cookie = cookie;
}

<… 쿠키의 만료 시간이 지났다면 해당 개체는 업데이트되지 않았기 때문입니다.

*/
$.get = 함수 (k) {
var cks = document.cookie.split(;);
var t;
for (var i = 0; i < ; cks.length; i ) {
t = cks[i].split(=);
if (k == t[0].trim()) return t.length >= 2 ? (t[1]) : "";
        }
                                                                                                          $.getExpires(new Date().getFullYear() - 1), 경로, 도메인);
}
(;);
var t;
for (var i = 0; i < cks.length; i ) {
$.remove(cks[i].split(=)[0].trimm(), path , 도메인);
                                                                                                                                                     

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.