asp.Netmvcフィルタの基本方法
4037 ワード
asp.Netmvcのフィルタはとても使いやすいもので、ログインと権限検証に使われるのが最も一般的な使い方です.具体的な実現方法があります.資料を探すのは難しいです.今、よく使われている記録を取って、参考にしてください.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class LoginFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var session = filterContext.HttpContext.Session;
var request = filterContext.HttpContext.Request;
var response = filterContext.HttpContext.Response;
var user = session["Account"] as Account;
if (user == null)
{// ,
var token = Cookies.ReadCookie("remembermetoken");
Guid r = Guid.Empty;
if (Guid.TryParse(token, out r))
{
var account = Account.GetAccountByRememberMeToken(r);
if (account == null)
{
if (string.IsNullOrWhiteSpace(request["submitTime"]))
{
session.Clear();
Cookies.DeleteCoookie();
filterContext.Result = new JsonResult() { Data = new ReturnMsg(MessageType.LoginExpire) };
}
else
{
filterContext.Result = new RedirectResult(request.Url.Scheme + "://" + request.Url.Authority);
}
}
else
{//remember me
// ,
session["AccountId"] = account.id.ToString();
session["Account"] = account;
filterContext.Controller.ViewBag.User = account;
}
}
else
{
if (string.IsNullOrWhiteSpace(request["submitTime"]))
{
filterContext.Result = new RedirectResult(request.Url.Scheme + "://" + request.Url.Authority);
}
else
{
filterContext.Result = new JsonResult() { Data = new ReturnMsg(MessageType.LoginExpire) };
}
}
}
else
{
filterContext.Controller.ViewBag.User = user;
}
}
[ValidateInput(false)]
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var request = filterContext.HttpContext.Request;
var session = filterContext.HttpContext.Session;
var controller = filterContext.RouteData.Values["action"].ToString();
var action = filterContext.RouteData.Values["controller"].ToString();
var model = session["Account"] as Account;
var log = new VisitLog();
log.IP = HttpHelper.GetRealIPFromRequest(request);
log.Url = request.Url.AbsoluteUri;
log.module = controller;
log.page = action;
var pm = "";
for (int i = 0; i < request.Form.Count; i++)
{
pm += "&" + request.Form.Keys[i] + "=" + request.Form[i].Trim();
}
if (model != null)
{
log.AccountId = model.id;
}
log.Param = pm.Trim('&');
log.Method = request.HttpMethod;
VisitLog.Add(log);
}
}
この小段のコードは、字が珠玉で、内容が豊富で、フィルタ内でaspを取得することを含む.Netにオブジェクトを内蔵する方法、コントローラとターゲットメソッド名の取得、どのようにリダイレクトするか、jsonへの戻りを遮断するかなど、ログイン検証ロジック、アクセスログ記録、トップページへの戻り、rememberme機能の実現など、フィルタとして使用できるモデルとなります^^;