6

当面の問題は、変数内の文字列を配列に分割し、そこから文字列を解析できるように、すべての Cookie を追跡する変数が必要なことです。単純な次のコードが私のためにそれをしていないのはなぜだろうか?

var count = 0;          //keeps track of how many times this page has been visited
var lastVisit = new Date();     //records the last visit date in UTC format (or extra-challenge: in a user-friendly format like "Tuesday 10/12/2013 at 9:34:50")
var exDate  = new Date(lastVisit.getTime() + 30000);
var savedData = decodeURI(document.cookie);  //contains cookie contents

document.cookie = encodeURI("count=" + count.toString() + "; expires=" + exDate.toUTCString());

私が起こる必要があるのは、cookie を savedData 変数に追加するように設定するたびに、なぜこれが起こっていないのかわかりません。ありがとうございました

4

2 に答える 2

11

「expires=」をエンコードすることは想定されていません。それはあなたが望むものではない「expires%3D」に変わります。それに加えて、「;」をエンコードしないため、「encodeURI」を使用するのは悪い考えかもしれません。および必要に応じて「,」。

cookie 値をエンコードするために encodeURIComponent を使用できますが、技術的には escape() を使用して cookie 値をエンコードするのが正しいでしょう。

そう...

document.cookie = "count=" + encodeURIComponent(count.toString()) + "; expires=" + exDate.toUTCString();

...あなたが望むことをすべきです。
クッキーはいくつかの部分で構成されています。私たちは主に名前、価値、有効期限に関心があります。

(公式回答終わり)


Cookie のエンコードに関する混乱を解消しましょう

疑わしい場合は、RFC に連絡してください。Web で見つけたものをそのまま選択するのではなく、機能していると思われるものを選んでください。

cookie-name のタイプはtokenです。つまり、その中で使用できる値は
0x21-0x270x2A -0x2B、 0x2D-0x2E 、0x30-0x390x41-0x5A0x5E-0x7A、および0x7Eのみです。
つまり、次の値はパーセントでエンコードする必要があります:
0x00-0x20'('')'',''/'':'';' 「<」「=」「>」「?」'「[」「]」「{」「}」、および0x7F-0xFF

cookie-value のタイプはcookie-octetです。つまり、その中で許可される値は
0x21、0x23-0x2B、0x2D-0x3A、0x3C-0x5B、0x5D-0x7E のみです。
つまり、次の値はパーセントでエンコードする必要があります:
0x00-0x200x22','';' ''および0x7F-0xFF

これで、正しく行っているように、有効期限が toUTCString() を使用してエンコードされます。
結果は次のようになります: Wed, 09 Jun 2021 10:18:14 GMT -したがって、コンマが含まれます。しかし!cookie-name と cookie-value 文字列を除いて、何もエンコードしないことになっています。

注: W3Schoolsは、escape() は JavaScript 1.5 で廃止されたと述べていますが、Cookie に encodeURI() または encodeURIComponent() を使用することは技術的に正しくありません。クッキーに escape() を使用することは技術的に正しいです。

RFC 6265 セクション 5.4には、次のように明確に記載されています。

注: その名前にもかかわらず、cookie-string は実際には一連の文字では
なく一連のオクテットです。cookie 文字列
(またはその構成要素) を (たとえば、ユーザーに提示するために) 文字のシーケンスに変換するために、ユーザー エージェントは、 UTF-8 文字エンコーディング [RFC3629] を
使用してオクテット シーケンスをデコードしようとする場合があります。ただし、すべてのオクテット シーケンスが有効な UTF-8 であるとは限らないため、このデコードは失敗する可能性があります。

decodeURIComponent() は Unicode 文字列用であり、0x00 から 0xFF の間のバイト値でチョークするため、安全に使用することはできません。一方、unescape() は文字列用ではなく、8 ビット バイト シーケンス用です。octets、ただしバイトシーケンスにユニコード文字が含まれていない場合のみ。

ただし、 Cookie 値に Unicode 文字が含まれている場合は、encodeURIComponent()/decodeURIComponent() を使用する必要がありますが、サーバーは受信したいものを正確に送信しない可能性があるため、例外もキャッチする必要があります。

于 2014-12-03T20:50:35.327 に答える