.Net Mvc 四种过滤器
一.授权过滤器:AuthorizationFilters
二.动作过滤:ActionFilters
三.响应过滤:ResultFilters
四.异常过滤:ExceptionFilters
========================================================================================================================
一。授权过滤,这里以登陆账号密码,角色id不同进行过滤。
1.添加一个过滤类 , 用于过滤掉和角色id不符合要求的账号。
using Newtonsoft.Json;
using Solution.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security; namespace Solution.Filter
{
public class UserAuthorize : AuthorizeAttribute
{
//允许的角色id集合
public string[] x { get; set; } /// <summary>
/// 请求授权时调用相关的参数
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
string[] str = Roles.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
x = new string[str.Length];
for (int i = ; i < str.Length; i++)
{
x[i] = str[i];
}
base.OnAuthorization(filterContext);
} protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var thisUser = UserHelper.user;
bool status = true;
//判断是否登陆
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
return false;
} //判断角色
if (x.Count() > && status==true)
{
status = x.Contains(thisUser.role);
} return status; }
} }
2.在Home控制器下添加对应的登陆和退出方法,登陆后跳转的页面。
创建LogDto类,用于封装登陆时需填写的属性
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Solution.Model
{
public class LogDto
{
public string Account { get; set; } public string PassWord { get; set; }
}
}
创建UserIdEntity类,用于封装存入cookie的票据信息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace Solution.Models
{
public class UserIdEntity
{
public string Account { get; set; } public string PassWord { get; set; } public string role { get; set; }
}
}
创建ResponseMsg类,用于方法返回的结果信息
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Solution.Common
{
public class ResponseMsg
{
/// <summary>
/// 默认构造函数
/// </summary>
public ResponseMsg()
{
} /// <summary>
/// 设置初始值
/// </summary>
/// <param name="_Status"></param>
public ResponseMsg(ActonState _Status)
{
_status = _Status;
} public ActonState _status; public ActonState Status
{
get { return _status; }
set { _status = value; }
} public string Msg { get; set; } public string LoadUrl { get; set; } public object Data { get; set; } } public enum ActonState
{
Default = ,//默认 Success = , //成功 Failure = ,//失败 ServerError = ,//服务错误 Others = //其它
}
}
在Home控制器下编写登陆方法
[HttpPost]//只允许post请求
public ActionResult LogOn(LogDto logdto)
{
string name = logdto.Account;
string pwd = logdto.PassWord;
ResponseMsg response = new ResponseMsg() { Status = ActonState.Default }; if ("Admin".Equals(name) && "".Equals(pwd))
{
UserIdEntity identity = new UserIdEntity() { Account = name, PassWord = pwd, role = "" };
//创建Form票据
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(, name, DateTime.Now, DateTime.Now.AddHours(), false, JsonConvert.SerializeObject(identity));
//将票证转为字符串(加密)
string str = FormsAuthentication.Encrypt(ticket);
//将该票证存到cookie中
//FormsAuthentication.SetAuthCookie(str,true);
HttpCookie coo = new HttpCookie("DIQx", str); //cookie名称必须与配置中名称相同,否则读取不到userdata
Response.Cookies.Add(coo);
response.LoadUrl = "/Home/Main";
response.Status = ActonState.Success;
}
else {
response.Status = ActonState.Default;
}
return Json(response);
}
要跳转的页面,这里只允许角色Id为(1,2,3)中的其中的一个进入。且[Roles=""]标记为固定写法
[UserAuthorize(Roles="1,2,3")]
public ActionResult Main()
{
return View();
}
退出登陆
[AllowAnonymous] //允许匿名
public ActionResult OutLogon()
{
Session.Abandon();
FormsAuthentication.SignOut();
return RedirectToAction("Index","Home");
}
在Web.config文件里 <system.web> 下添加配置如下,
<authentication mode="Forms">
<forms loginUrl="~/Home/Index" name="DIQx" timeout="2880" />
</authentication>
注:name="DIQx" 这个name值和登陆时把票据存入cookie时的cookie名称相同。
测试一下。
①什么也不填,直接地址栏输入要跳转的页面
②账号或密码输入错误的。
③角色id不是(1,2,3)中的一个
以上三种情况都会被阻止,并且跳转至刚才在WebConfig中配置的url地址

满足正确条件,返回Main页面

二。动作过滤 这里编写一个WebApi,对api方法进行加密。
编写过滤类,重写OnActionExecuting方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using System.Net.Http;
using Solution.Common;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace Solution.Filter
{
public class SecreKeyAttribute : ActionFilterAttribute
{ public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{ ResponseMsg response = new ResponseMsg() { Status = ActonState.Default }; //var Ticket = actionContext.ActionArguments["Ticket"];//get请求时带的参数 var Ticket = System.Web.HttpContext.Current.Request["Ticket"]; if (Ticket == null)
{
response.Msg = "请传入密钥!";
actionContext.Response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.OK, response);
}
else
{
string SecrtetKey = Ticket.ToString();
if (!SecrtetKey.Equals(""))
{
response.Msg = "密钥错误!";
actionContext.Response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.OK, response);
}
}
base.OnActionExecuting(actionContext); } public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{ base.OnActionExecuted(actionExecutedContext);
} }
}
编写WebApiConfig配置文件,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http; namespace Solution.Models
{
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",//默认请求api地址
routeTemplate: "api/{controller}/{action}/{id}", //例如:
http://localhost:41464/api/ScreateKey/GetInfo
defaults: new { id = RouteParameter.Optional });
}
}
}
在Golba.asax中Application_Start()方法下加入刚才的WebApi文件配置
WebApiConfig.Register(GlobalConfiguration.Configuration);
创建对应的api方法,并加入 [SecreKey]标签
using Solution.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http; using System.Net;
using System.Net.Http;
using Solution.Filter; namespace Solution.Controllers
{
public class ScreateKeyController : ApiController
{ // GET: ScreateKey
[SecreKey]
[HttpPost]
public ResponseMsg GetInfo([FromBody]string Ticket)
{
ResponseMsg response = new ResponseMsg() { Status = ActonState.Default };
response.Msg = "密钥正确时,会返回这个结果";
return response;
}
}
}
注:这里用的是post请求。 参数必须带上这个[FromBody],不然请求不到。而且这个[FromBody]只能用一次,如果有多个参数就只能封装到一个类里面。
测试一下。正确密钥 “8888888”
密钥错误:

密钥正确:

三。结果过滤
添加一个过滤特性类
using Solution.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace Solution.Filter
{
public class ResultAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext resultContext)
{
ResponseMsg response = new ResponseMsg() { Status = ActonState.Default };
resultContext.HttpContext.Response.Write("<br/> 结果返回之前执行");
base.OnResultExecuting(resultContext);
} public override void OnResultExecuted(ResultExecutedContext resultContext)
{
ResponseMsg response = new ResponseMsg() { Status = ActonState.Default };
resultContext.HttpContext.Response.Write("<br/> 结果返回之后执行");
base.OnResultExecuted(resultContext);
}
}
}
在Home控制器添加一个视图,并添加[Result]标签
[Result]
public ActionResult FunResult()
{
return View();
}
在FunResult.cshtml页面加入如下代码:
@{
Response.Write("<br/> 返回的结果");
}
测试一下,得到结果如下图:

四。异常过滤
创建一个发生错误时跳转的页面
添加一个异常过滤特性类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; using System.Web.Mvc; namespace Solution.Filter
{
//异常过滤器
public class HandErrorAttribute :HandleErrorAttribute
{
//程序中任何一个地方发生异常都会处理
public override void OnException(ExceptionContext filterContext)
{
//获取异常对象
Exception ex = filterContext.Exception; //记录日志 //发生错误后,跳转的页面
filterContext.Result = new RedirectResult("/Home/Error"); //告知异常已被处理。如果没有则按照系统正常的异常处理流程走!
filterContext.ExceptionHandled = true; }
}
}
在App_Start文件夹下创建FilterConfig文件
using Solution.Filter;
using System.Web;
using System.Web.Mvc; namespace Solution
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandErrorAttribute());
}
}
}
在Glabal.asa文件Application_Start()方法下添加刚才的筛选配置
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
.Net Mvc 四种过滤器的更多相关文章
- 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法
一. 简介 MVC中的过滤器可以说是MVC框架中的一种灵魂所在,它是MVC框架中AOP思想的具体体现,所以它以面向切面的形式无侵入式的作用于代码的业务逻辑,与业务逻辑代码分离,一经推出,广受开发者的喜 ...
- ASP.NET MVC中有四种过滤器类型
在ASP.NET MVC中有四种过滤器类型
- asp.net mvc 三种过滤器
前几天面试遇到这个问题,发现不是很了解,学习了下,这里记录下来 经常需要将用户的操作记录到日志中,或者是验证用户是否登录了网站, 面对这样的需求,以前的操作是自定义一个统一的全局方法,然后做处理, 在 ...
- ASP.NET MVC 四种传值方法
1.后台传值: public class DataController : Controller { // GET: Data public ActionResult Index() { //1 Vi ...
- net MVC 四种基本 Filter
四种基本 Filter 概述 MVC框架支持的Filter可以归为四类,每一类都可以对处理请求的不同时间点引入额外的逻辑处理.这四类Filter如下表: 使用内置的Authorization Fi ...
- ASP.NET MVC 四种Controller向View传值方法
控制器: // Get: Data public ActionResult Index() { //ViewData 方式 ViewData["UserName"] = " ...
- ASP.NET MVC 主要的四种过滤器和三种具体实现类
4种常用过滤器(IAuthrorizationFilter.IActionFilter.IResultFilter.IExceptionFilter) 和 3种具体实现类(AuthorizeAttri ...
- 你想要的都在这里,ASP.NET Core MVC四种枚举绑定方式
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
- ASP.NET Core MVC四种枚举绑定方式
前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...
随机推荐
- FTP文件传输协议两种模式 ftp协议集,错误码集,ftp客户端命令集
TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20.FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置.联接的方式.甚至是是否使用相同的操 ...
- 安装ElasticSearch客户端Kibana
安装Kibana Kibana是一个为 ElasticSearch 提供的数据分析的 Web 接口.可使用它对日志进行高效的搜索.可视化.分析等各种操作. wget https://artifacts ...
- 转:oracle几组重要的常见视图-v$undostat,v$open_cursor,v$rowcache,v$session_longops,v$waitstat
v$undostat 本视图监控当前实例中undo空间以及事务如何运行.并统计undo空间开销,事务开销以及实例可用的查询长度. V$UNDOSTAT中的常用列 Endtime:以10分钟为间隔的结束 ...
- 转载:细说oracle 11g rac 的ip地址
本文转载自:细说oracle 11g rac 的ip地址 http://blog.sina.com.cn/s/blog_4fe6d4250102v5fa.html 以前搭建oracle rac的时候( ...
- hardentools
Hardentools是一组简单的实用程序,旨在禁用操作系统(Microsoft Windows,现在)以及主要的消费者应用程序公开的许多“功能”.这些通常为企业客户所设想的功能,对于普通用户来说通 ...
- EF中新建表和关联表的方法
以机场表为例 private static AIRPORT_HELIPORTManager AirportHeliportManager => ManagerFactory.Instance.A ...
- SqlServer——临时表
1.表的类型: SqlServer数据库中分为两个表:永久表.临时表:通过表名的前缀区分. 永久表:与物理文件.C# 中的静态类 类似,任何用户均可对其执行操作并且相互影响: 临时表:简单的说就是使用 ...
- 因浏览器而异的空白节点(js清除空白节点)
先看下面的代码:<dl id="dll"> <dt>title</dt> <dd>definition</dd>&l ...
- ajax请求参数中含有特殊字符"#"的问题 (另附上js编码解码的几种方法)
使用ajax向后台提交的时候 由于参数中含有# 默认会被截断 只保留#之前的字符 json格式的字符串则不会被请求到后台的action 可以使用encodeURIComponent在前台进行编码, ...
- java基础之io流总结三:字节流读写
字节流读写适用于任何文件,包括图片,视频等. 基本字节流 一次读一个字节和一次读一个字节数组 FileInputStream fis = new FileInputStream(path); //一次 ...