(オリジナル)ASP.NETの中で、どのように巧みにHttpModuleを使って、システムの全局の登录のロジックの判断を実现して、达人は慎重に入ります
22021 ワード
今晩コードを書いて、今すでに1:27になっても、依然として情熱に満ちています.
ほとんどのシステムはログインしなければなりません.私はいくつかのシステムが直接各ページのPageを見たことがあります.Loadでif(session[「user」==null)を判断し,登録判断を実現する.これはよくないと思います.メンテナンス性が悪いです.
今日私が実現するのは、システムのグローバルログインロジック判断です.
やはり直接コードを貼って、コードはすべてを説明することができます.
まずSiteUserクラスを定義します.
次に、クライアントとサーバ側のステータス情報を維持するためのPassportManagerクラスを定義します.
次に、IPublicPageの空のインタフェースを定義します.なぜ空のインタフェースなのか知りたいかもしれません.空のインタフェースは私たちの要求を満たすのに十分だからです.
そしてpassport-loginを構築しますaspxページ、ログインに使用します.ここではプレゼンテーションなので、データベースにアクセスする必要はありません.
passport-login.aspxのバックグラウンドコードは以下の通りです.
Index.aspxページは簡単です.コードは以下の通りです.
Index.aspxのバックグラウンドコードも簡単です.passport-loginに似ていません.aspxは、ログインが必要なため、IPublicPageを実装します.
最後に、これもコア部分で、新しいLoginModuleクラスを作成し、IHttpModuleを実現します.
最後にWeb.Configファイルに登録してください.
最後に実行し、Indexにアクセスします.aspxページ、passport-loginにジャンプできました.aspxページは、勝手にユーザー名とパスワードを入力した後、ログインをクリックしてIndexに戻ります.aspx、成功!
Demoダウンロード:http://files.cnblogs.com/Music/PrivilegeDemo.rar
閲覧ありがとうございます!
ほとんどのシステムはログインしなければなりません.私はいくつかのシステムが直接各ページのPageを見たことがあります.Loadでif(session[「user」==null)を判断し,登録判断を実現する.これはよくないと思います.メンテナンス性が悪いです.
今日私が実現するのは、システムのグローバルログインロジック判断です.
やはり直接コードを貼って、コードはすべてを説明することができます.
まずSiteUserクラスを定義します.
/// <summary>
///
/// </summary>
public class SiteUser
{
public int Id { get; set; }
public string UserName { get; set; }
public DateTime LoginTime { get; set; }
}
次に、クライアントとサーバ側のステータス情報を維持するためのPassportManagerクラスを定義します.
/// <summary>
/// , Session Cookie
/// </summary>
public class PassportManager
{
/// <summary>
///
/// </summary>
/// <param name="siteUser"></param>
public static void SaveSiteUser(HttpContext context, SiteUser siteUser)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (siteUser == null)
{
throw new ArgumentNullException("siteUser");
}
if (context.Session == null)
{
throw new NotSupportedException(" Session Null, !");
}
context.Session["currentUser"] = siteUser;
}
/// <summary>
/// , , null
/// </summary>
/// <param name="context"> </param>
/// <returns></returns>
public static SiteUser GetPassport(HttpContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (context.Session == null)
{
throw new NotSupportedException(" Session Null, !");
}
return (SiteUser)context.Session["currentUser"];
}
/// <summary>
///
/// </summary>
/// <param name="context"> </param>
public static void PassportLogout(HttpContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
context.Session.Clear();
context.Session.Abandon();
}
}
次に、IPublicPageの空のインタフェースを定義します.なぜ空のインタフェースなのか知りたいかもしれません.空のインタフェースは私たちの要求を満たすのに十分だからです.
/// <summary>
/// ,
/// </summary>
public interface IPublicPage
{
}
そしてpassport-loginを構築しますaspxページ、ログインに使用します.ここではプレゼンテーションなので、データベースにアクセスする必要はありません.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1> </h1>
</div>
<div>
:<asp:TextBox ID="txtLoginName" runat="server" Width="300px">
</asp:TextBox><br /><br />
:<asp:TextBox ID="txtLoginPassword" runat="server" TextMode="Password" Width="300px">
</asp:TextBox>
<br /><br />
<asp:Button ID="btnLogin" runat="server" Text=" " OnClick="btnLogin_Click" />
<a href="Index.aspx"> </a>
</div>
</form>
</body>
</html>
passport-login.aspxのバックグラウンドコードは以下の通りです.
public partial class passport_login : System.Web.UI.Page, IPublicPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnLogin_Click(object sender, EventArgs e)
{
string userName = this.txtLoginName.Text;
string userPassword = this.txtLoginPassword.Text;
SiteUser user = new SiteUser()
{
Id = 1,
UserName = userName,
LoginTime = DateTime.Now
};
PassportManager.SaveSiteUser(Context, user);
Response.Redirect("Index.aspx");
}
}
Index.aspxページは簡単です.コードは以下の通りです.
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1> </h1>
</div>
<div>
,<asp:Literal ID="ltLoginName" runat="server" />
:<asp:Literal ID="ltLoginTime" runat="server" />
</div>
</form>
</body>
</html>
Index.aspxのバックグラウンドコードも簡単です.passport-loginに似ていません.aspxは、ログインが必要なため、IPublicPageを実装します.
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
{
InitData();
}
}
protected void InitData()
{
SiteUser siteUser = PassportManager.GetPassport(Context);
this.ltLoginName.Text = siteUser.UserName;
this.ltLoginTime.Text = siteUser.LoginTime.ToString("yyyy-MM-dd HH:mm:ss");
}
}
最後に、これもコア部分で、新しいLoginModuleクラスを作成し、IHttpModuleを実現します.
public class LoginModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
}
private void context_AcquireRequestState(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
if(context.Handler is IRequiresSessionState && !(context.Handler is IPublicPage))
{
// ,
SiteUser user = PassportManager.GetPassport(context);
if (user == null)
{
context.Response.Redirect("passport-login.aspx?returnUrl=" + HttpUtility.UrlEncode(context.Request.RawUrl));
}
}
}
}
最後にWeb.Configファイルに登録してください.
<system.web>
<httpModules>
<add name="LoginModule" type="PrivilegeDemo.WebUI.Code.LoginModule"/>
</httpModules>
</system.web>
最後に実行し、Indexにアクセスします.aspxページ、passport-loginにジャンプできました.aspxページは、勝手にユーザー名とパスワードを入力した後、ログインをクリックしてIndexに戻ります.aspx、成功!
Demoダウンロード:http://files.cnblogs.com/Music/PrivilegeDemo.rar
閲覧ありがとうございます!