web-dev-qa-db-ja.com

Cookieが存在するかどうかを確認します

Stack Overflowのクイック検索から、Cookieが存在するかどうかを確認する次の方法を提案する人々を見ました:

HttpContext.Current.Response.Cookies["cookie_name"] != null

または(Pageクラス内):

this.Response.Cookies["cookie_name"] != null

ただし、インデクサー(またはCookies.Getメソッド)を使用して存在しないCookieを取得しようとすると、実際にはcreateその名前の「デフォルト」Cookieであり、それを返すようです。使用するCookie名に関係なく、nullを返すことはありません。 (さらに悪いことに、不要なCookieを作成します)

ここで何か間違ったことをしていますか、それとも名前で特定のCookieの存在を単純に確認する別の方法がありますか?

44
Acidic

_Response.Cookies_には、ブラウザーに送り返されるCookieが含まれます。 Cookieが存在するかどうかを知りたい場合は、おそらく_Request.Cookies_を調べる必要があります。

とにかく、Cookieが存在するかどうかを確認するには、 Cookies.Get(string) を確認します。 ただし、Responseオブジェクトでこのメソッドを使用し、Cookieが存在しない場合、そのCookieが作成されます。

_HttpCookieCollection.Get_ Method(String) のMSDNリファレンスを参照してください

30
zmbq

CookieがResponseに存在するかどうかをまだ知る必要がある場合があります。次に、Cookieキーが存在するかどうかを確認できます。

HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")

詳細は こちら をご覧ください。

私の場合、Global.asaxのApplication_EndRequestメソッドで応答Cookieを変更する必要がありました。 Cookieが存在しない場合、私はそれに触れません。

string name = "myCookie";
HttpContext context = ((HttpApplication)sender).Context;
HttpCookie cookie = null;

if (context.Response.Cookies.AllKeys.Contains(name))
{
    cookie = context.Response.Cookies[name];
}

if (cookie != null)
{
    // update response cookie
}
50
marisks

あなたが達成しようとしていることに応じて、ここには多くの正解があります。包括的な答えを提供しようとする私の試みは次のとおりです。

RequestおよびResponseオブジェクトの両方には、CookiesプロパティであるHttpCookieCollectionオブジェクトが含まれます。

Request.Cookies:

  • このコレクションには、クライアントから受信したCookieが含まれています
  • このコレクションは読み取り専用です
  • このコレクションから存在しないCookieにアクセスしようとすると、null値を受け取ります。

Response.Cookies:

  • このコレクションには、現在の要求中にサーバーによって追加されたCookieのみが含まれます。
  • このコレクションは書き込み可能です
  • このコレクションから存在しないCookieにアクセスしようとすると、新しいCookieオブジェクトを受け取ります。アクセスしようとしたCookieがNOTRequest.Cookiesコレクションに存在する場合、追加されます(ただし、Request.Cookiesオブジェクトに既にCookieが含まれている場合)同じキーで、値が古い場合でも、Response.Cookiesコレクションに新しく作成されたCookieからの変更を反映するために更新されません。

ソリューション


クライアントからのCookieの存在を確認する場合は、次のいずれかを実行します

  • Request.Cookies["COOKIE_KEY"] != null
  • Request.Cookies.Get("COOKIE_KEY") != null
  • Request.Cookies.AllKeys.Contains("COOKIE_KEY")

サーバーによって追加されたCookieの存在を確認する場合は、現在のリクエスト中で、次の手順を実行します。

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY")here を参照)

サーバーによって追加されたCookieを確認しようとしています現在のリクエスト中これらのメソッドのいずれかによって...

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != nullhere を参照)

...Response.CookiesコレクションにCookieが作成され、状態はtrueと評価されます。

37
Trevor

HttpContext.Current.Request.Cookiesではなく、Response.Cookiesを使用する必要があります。

サイドノート:CookieはResponse.Cookies.Addのリクエストにコピーされ、新しく追加されたCookieに対して同じ動作をするかどうかをチェックします。ただし、着信CookieがResponseに反映されることはありません。

この動作は HttpResponse.Cookies propertyで文書化されています:

HttpResponse.Cookiesコレクションを使用してCookieを追加すると、応答がクライアントに送信されていなくても、CookieはHttpRequest.Cookiesコレクションですぐに使用可能になります。

35
Alexei Levenkov
public static class CookieHelper
{
    /// <summary>
    /// Checks whether a cookie exists.
    /// </summary>
    /// <param name="cookieCollection">A CookieCollection, such as Response.Cookies.</param>
    /// <param name="name">The cookie name to delete.</param>
    /// <returns>A bool indicating whether a cookie exists.</returns>
    public static bool Exists(this HttpCookieCollection cookieCollection, string name)
    {
        if (cookieCollection == null)
        {
            throw new ArgumentNullException("cookieCollection");
        }

        return cookieCollection[name] != null;
    }
}

使用法:

Request.Cookies.Exists("MyCookie")
4
Levitikon

申し訳ありませんが、コメントを追加するのに十分な担当者ではありませんが、zmbqの答えから:

とにかく、Cookieが存在するかどうかを確認するには、Cookies.Get(string)を確認します。これにより、Cookieコレクションは変更されません。

cookies.Get(string)は、まだ存在しない場合、実際にその名前でCookieを作成するため、完全に正しいとは限りません。ただし、彼が言ったように、Response.CookiesではなくRequest.Cookiesを見る必要があります。

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
2
Fiddles

Cookieの値を調べるには、次のようなことを実行できます。

Request.Cookies[SESSION_COOKIE_NAME].Value
0
Hernan Bogantes