4

私は常にユーザーのデータを(ユーザーがログインした後)Session変数に保存しているので、そのデータを任意のページで使用できます。
情報をグローバルに保存する別の方法は、情報をクラスに保存し、を使用し{ get; set;}て、任意のページから呼び出すことであることがわかりました。

今、私はこれらの両方の方法をテストとして使用しましたが、どちらも非常にうまく機能します。

Session["LoginId"] = rdr["uniqueIdentifier"].ToString();

Member.LoginId = rdr["uniqueIdentifier"].ToString();

ここで(Member.cs内

public class Member
{
    public static int Challenges { get; set; }
    public static int NicknameId { get; set; }
    public static string LoginId { get; set; }
    public static string FriendsListId { get; set; }

    public static void ClearVariables()
    {
        Challenges = 0;
        NicknameId = 0;
        LoginId = null;
        FriendsListId = null;
    }
}

Global.asax

void Session_End(object sender, EventArgs e) 
    {
        Member.ClearVariables();
    }

私の質問は、ユーザーデータをこのようなクラスに保存するのに十分安全ですか、それともSessionオブジェクトに固執する必要がありますか?

完全を期すために更新 この投稿は上記のようなことをしますが、複数のユーザーを対象としていますか? ASP.NETの任意のクラスからセッション変数にアクセスするにはどうすればよいですか?

4

6 に答える 6

8

このアプローチは、最も使いやすく、チャンスのエラーが最も少ないものの1つであることがわかりました。これはファサードデザインパターンと呼ばれていると思います。

 public class SiteSession
{
    #region Attributes
    private static string _siteSession = "__SiteSession__";
    #endregion

    #region Constructor
    private SiteSession()
    {
    }
    #endregion

    #region CurrentSession
    public static SiteSession Current
    {
        get
        {
            SiteSession session = HttpContext.Current.Session[_siteSession ] as    SiteSession;
            if (session == null)
            {
                session = new SiteSession();
                HttpContext.Current.Session[_siteSession ] = session;
            }
            return session;
        }
    }
    #endregion

    #region SessionProperties
    public sherserve.CustomTypes.UserTypes UserType { get; set; }
    public int UserID { get; set; }
    public String StaffID { get; set; }
    public String Position { get; set; }
    public String StaffName { get; set; }
    public int TimeZone { get; set; }

    public String DealerId { get; set; }
    public String DealerPosition { get; set; }
    public String DealerName { get; set; }
    public int DealerFirmId { get; set; }

    public String ClientId { get; set; }
    public String ClientName { get; set; }
    public String ClientBusiness { get; set; }
    public String CountryCode { get; set; }
    public int ClientFirmId { get; set; }
    #endregion

}

値は次のようにSessionに保存できます。

 SiteSession.Current.UserType = user.UserType;

そして、このように取得することができます:

int userId=    SiteSession.Current.UserID;

タイプセーフでもあります。

于 2012-10-23T07:44:34.850 に答える
8

あなたの場合、asp.netの静的変数はすべてのユーザーに共通であるため、まったく安全ではありません。

于 2012-10-23T06:18:33.393 に答える
3

静的変数の使用は安全ではありません。あるユーザーに設定された値は、別のユーザーの値を上書きします。
静的変数は、1つの変数のみが作成され、すべてのセッションで使用されることを意味します。静的変数の有効期間は、アプリケーションの有効期間です。
変数がユーザー固有(そうであるように見える)であることが意図されている場合は、セッション変数に固執する必要があります。

于 2012-10-23T06:19:38.590 に答える
1

私はそれがあなたのために働いていないと確信しています。クラスのインスタンスは、リクエストが処理されている間だけ存在します。リクエストが処理されると、クラスのインスタンスを再度取得することはできなくなります。静的変数の場合、アプリケーション全体であり、ユーザー固有の情報を格納するのには適していません。

セッションは、ポストバック全体でアプリケーションの状態を処理するように設計されており、セッションの唯一の目的です。つまり、アプリケーションの状態を維持することであり、要件に最適です。

于 2012-10-23T06:20:47.543 に答える
0

2番目のアプローチの欠点は、アプリケーションを再起動すると変数の値が失われることです。ただし、セッションを使用すると、データはブラウザのCookieに保存されます。

編集:

静的変数は、アプリケーションレベルの共通変数(すべてのユーザー間で共有変数)が必要な場合にのみ使用してください。

于 2012-10-23T06:19:27.297 に答える
0

セッションはユーザーごとに作成されますが、本番環境のクラスは、アプリケーションの存続期間全体を通じて存続します。

1人のユーザーだけで開発中に問題が発生することはないかもしれませんが、本番環境では、各リクエストが以前のデータを上書きするため、セキュリティリスクが発生する可能性があります。

セッションに固執します。

于 2012-10-23T06:22:10.460 に答える