提到过滤类,就要先介绍一下ActionFilterAttribute这个基类
ActionFilterAttribute:表示筛选器特性的基类。
这个类下面有四个虚方法:
在执行操作方法后由 ASP.NET MVC 框架调用。
public virtual void OnActionExecuted(ActionExecutedContext filterContext);
在执行操作方法之前由 ASP.NET MVC 框架调用。
public virtual void OnActionExecuting(ActionExecutingContext filterContext);
在执行操作结果后由 ASP.NET MVC 框架调用。
public virtual void OnResultExecuted(ResultExecutedContext filterContext);
在执行操作结果之前由 ASP.NET MVC 框架调用。
public virtual void OnResultExecuting(ResultExecutingContext filterContext);
在本文主要介绍一下OnActionExecuting这个方法:
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
namespace demo.App_Start
{
/// <summary>
/// 过滤类
/// </summary>
//[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class FilterController:ActionFilterAttribute
{
//filterContextInfo fcinfo;
/// <summary>
/// OnActionExecuting 在执行操作方法之前由 ASP.NET MVC 框架调用。
/// 此处进行session过滤
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
HttpCookie cookie = filterContext.HttpContext.Request.Cookies["user"];
#region 这里也可以进行权限操作
//bool islogin = false;
//if (cookie != null)
//{
// islogin = true;
//}
//fcinfo = new filterContextInfo(filterContext);
//string domainName = fcinfo.domainName;//获取域名
//string controllerName = fcinfo.controllerName;//获取 controllerName 名称
//string actionName = fcinfo.actionName;//获取方法名
//if (islogin)//有权限
//{
// #region
// //跳转到访问的页面
// //filterContext.Result = new HttpUnauthorizedResult("/UserLogin/index");
// //也可以跳到别的站点
// // filterContext.Result = new RedirectResult("http://www.baidu.com");
// //filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { Controller = "product", action = "Default" }));
// #endregion
// return;
//}
//else
//{
// //此处可记录访问受限的用户操作信息写入数据库
// filterContext.Result = new ContentResult { Content = @"抱歉,你不具有当前操作的权限!" };// 直接返回 return Content("抱歉,你不具有当前操作的权限!")
//}
#endregion
if (cookie != null)
{
if (filterContext.HttpContext.Session["useradmin"] == null)
{
string username = demo.helper.DESEncrypt.Decrypt(cookie.Value);
MySql.Data.MySqlClient.MySqlParameter[] sqlpar = {
new MySql.Data.MySqlClient.MySqlParameter("@username",username)
};
var ds = demo.UserMethod.User.GetList("username=@username", sqlpar);
var model = demo.UserMethod.User.DataTableToList(ds.Tables[0]);
if (model != null)
{
cookie.Expires = DateTime.Now.AddMinutes(15);
filterContext.HttpContext.Response.Cookies.Add(cookie);
filterContext.HttpContext.Session["useradmin"] = model;
return;
}
}
else
{
cookie.Expires = DateTime.Now.AddMinutes(15);
filterContext.HttpContext.Response.Cookies.Add(cookie);
return;
}
}
}
catch (Exception ex)
{
//异常处理,可将异常写入数据库
}
if (filterContext.RequestContext.HttpContext.Request.HttpMethod.ToLower().Equals("get"))
{
filterContext.Result =
new ContentResult() { Content = "{\"code\":10010,\"msg\":\"请求有误!\"}", ContentType = "application/json; charset=utf-8", ContentEncoding = Encoding.UTF8 };
return;
}
//session过期.
filterContext.HttpContext.Response.AddHeader("sessionstate", "timeout");
filterContext.Result =
new ContentResult() { Content = "{\"code\":10011,\"msg\":\"系统检查到用户操作超时,请重新登录!\"}", ContentType = "application/json; charset=utf-8", ContentEncoding = Encoding.UTF8 };
//重定向
//filterContext.HttpContext.Response.Redirect(@"/UserLogin/index");
}
#region
/// <summary>
/// OnResultExecuting 在执行操作结果之前由 ASP.NET MVC 框架调用。
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
base.OnResultExecuting(filterContext);
}
/// <summary>
/// OnActionExecuted 在执行操作方法后由 ASP.NET MVC 框架调用。
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
/// <summary>
/// OnResultExecuted 在执行操作结果后由 ASP.NET MVC 框架调用。
/// </summary>
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
}
#endregion
#region Class
public class filterContextInfo
{
public filterContextInfo(ActionExecutingContext filterContext)
{
#region 获取链接中的字符
// 获取域名
domainName = filterContext.HttpContext.Request.Url.Authority;
//获取模块名称
module = filterContext.HttpContext.Request.Url.Segments[1].Replace('/', ' ').Trim();
//获取 controllerName 名称
controllerName = filterContext.RouteData.Values["controller"].ToString();
//获取ACTION 名称
actionName = filterContext.RouteData.Values["action"].ToString();
#endregion
}
/// <summary>
/// 获取域名
/// </summary>
public string domainName { get; set; }
/// <summary>
/// 获取模块名称
/// </summary>
public string module { get; set; }
/// <summary>
/// 获取 controllerName 名称
/// </summary>
public string controllerName { get; set; }
/// <summary>
/// 获取ACTION 名称
/// </summary>
public string actionName { get; set; }
}
#endregion
}
}
调用方法: