ここでencodeURIComponent()は、Cookieの値をエスケープするために正しいですか? それは「脱出」であるべきではありませんか?
Cookieはプラグインに正常に出入りしますが、パス名を含むCookieは、エンコーディングを選択しているため、他の人がそのまま使用することはできません。
encodeURIComponent
/ decodeURIComponent
を使用する理由は、 escape
/ unescape
が非推奨になったためです。
それを除けば、私はまだ問題がここにあるのか理解していません。 Cookieの値は、返される前にdecodeURIComponentを介して実行されます。 したがって、何かが足りない場合を除いて、Cookieに渡されたときとまったく同じである必要があります。 問題を説明するための要点などを投稿していただけますか?
最後になりましたが、最初にraw
オプションを使用して、エンコードをバイパスできます。
あなたはそれが非推奨になることについて正しいです。 おそらくencodeURI()は、encodeURIComponent()の代わりに本当に必要なものです。
簡単に言うと、問題は次のとおりです。コードは、Cookieがプラグインを介して作成および消費されている場合にのみ機能します。 プラグインを使用してCookieを作成し、それをphpまたはjavaアプリから読み取ろうとすると、そのアプリはCookieがencodeURIComponent()でエンコードされていることを認識している必要があり、バックエンドでurldecoded()である必要があります。
これが問題を引き起こす主な場所は、URLまたはURIをCookieに入れるときです。 「/ foo」をクッキーに入れたいとしましょう。 EncodeURIComponent()は使用できないパス名「%2Ffoo」を提供し、encodeURI()は「/ foo」を提供します。これは、バックエンドシステムまたはプラグインなしでCookieを使用する他のユーザーが直接使用できます。
ここでのencode()の利点は、実際には、Cookie値にセミコロンがある場合、それがエスケープされることです。 encodeURI()はセミコロンをエスケープしないため、encodeURI()の使用に加えて、それを処理するためのコードを追加する必要があります。
Rawは大丈夫ですが、人々がエンコーディングに問題を抱えていたので、おそらくあなたがそれを追加したと思います。 encodeURI()を使用する場合は、おそらくもう必要ありません。
encodeURI
使用できない理由:
encodeURI('foo;bar') == "foo;bar"
しかし:
encodeURIComponent('foo;bar') == "foo%3Bbar"
後者は私たちが望む行動です。
raw
は、実際にはサーバーとうまく連携するために追加されました。
なぜあなたがその振る舞いをしたいのか知りたいのですが? 他の場所で答えを見つけるのに苦労していますhttp://stackoverflow.com/questions/5743119/why-use-encodeuricomponent-when-writing-json-to-a-cookie
私のように答えを探しているときに他の誰かがこの議論を見つけた場合:
CookieはHTTPヘッダーとしてサーバーに渡されます。
クッキー:name1 = value1; name2 = value2
明らかに、value1に;を含めることはできません。
他にも問題のあるキャラクターがいます。
事実、Cookieはエンコーディングの欠如によって根本的に妨げられています。 エンコーディングを選択して、ブラウザとサーバーの両方で使用する必要があります。
MDNはencodeURIComponentを推奨しています: //developer.mozilla.org/en-US/docs/Web/API/document.cookie
最も参考になるコメント
私のように答えを探しているときに他の誰かがこの議論を見つけた場合:
CookieはHTTPヘッダーとしてサーバーに渡されます。
クッキー:name1 = value1; name2 = value2
明らかに、value1に;を含めることはできません。
他にも問題のあるキャラクターがいます。
事実、Cookieはエンコーディングの欠如によって根本的に妨げられています。 エンコーディングを選択して、ブラウザとサーバーの両方で使用する必要があります。
MDNはencodeURIComponentを推奨しています: //developer.mozilla.org/en-US/docs/Web/API/document.cookie