一.授权过滤器: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 四种过滤器的更多相关文章

  1. 第四节:MVC中AOP思想的体现(四种过滤器)并结合项目案例说明过滤器的实际用法

    一. 简介 MVC中的过滤器可以说是MVC框架中的一种灵魂所在,它是MVC框架中AOP思想的具体体现,所以它以面向切面的形式无侵入式的作用于代码的业务逻辑,与业务逻辑代码分离,一经推出,广受开发者的喜 ...

  2. ASP.NET MVC中有四种过滤器类型

    在ASP.NET MVC中有四种过滤器类型

  3. asp.net mvc 三种过滤器

    前几天面试遇到这个问题,发现不是很了解,学习了下,这里记录下来 经常需要将用户的操作记录到日志中,或者是验证用户是否登录了网站, 面对这样的需求,以前的操作是自定义一个统一的全局方法,然后做处理, 在 ...

  4. ASP.NET MVC 四种传值方法

    1.后台传值: public class DataController : Controller { // GET: Data public ActionResult Index() { //1 Vi ...

  5. net MVC 四种基本 Filter

    四种基本 Filter 概述 MVC框架支持的Filter可以归为四类,每一类都可以对处理请求的不同时间点引入额外的逻辑处理.这四类Filter如下表:   使用内置的Authorization Fi ...

  6. ASP.NET MVC 四种Controller向View传值方法

    控制器: // Get: Data public ActionResult Index() { //ViewData 方式 ViewData["UserName"] = " ...

  7. ASP.NET MVC 主要的四种过滤器和三种具体实现类

    4种常用过滤器(IAuthrorizationFilter.IActionFilter.IResultFilter.IExceptionFilter) 和 3种具体实现类(AuthorizeAttri ...

  8. 你想要的都在这里,ASP.NET Core MVC四种枚举绑定方式

    前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...

  9. ASP.NET Core MVC四种枚举绑定方式

    前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便,之前我们探讨过在ASP.NET MVC中下拉框绑定方式,这节我们来再来重点看看枚举绑定的方式,充分实现你所能想到的场景,满 ...

随机推荐

  1. (转)WebApi发送HTML表单数据:文件上传与多部分MIME

    5.3 Sending HTML Form Data5.3 发送HTML表单数据(2) 本文引自:http://www.cnblogs.com/r01cn/archive/2012/12/20/282 ...

  2. Java-Maven-Runoob:Maven教程

    ylbtech-Java-Maven-Runoob:Maven教程 1.返回顶部 1. Maven 教程 Maven 翻译为"专家"."内行",是 Apache ...

  3. Py修行路 python基础 (七)文件操作 笔记(随时更改添加)

    文件操作流程: 1.打开文件 open() 2.操作文件 read .writeread(n) n对应读指定个数的 2.x中读取的是字节! 3.x中读取的是字符!read 往外读取文件,是以光标位置开 ...

  4. Centos7 SSH公钥生成及配置

    1.你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" 2.按照提示完成三次回车,即可生成 ssh key.通过查 ...

  5. chart左侧

    左侧单位 Chart1.Axes.Left.Minimum := ; Chart1.Axes.Left.Maximum := Series1.YValues.MaxValue * ; Chart1.A ...

  6. saltstack系列(二)——zmq应答模式

    python zeromq介绍 1.ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议. 2.有自己的模式,不同于更底层的点对点通讯模式. 3.有比tcp协议更高一级的协议(当然 ...

  7. solr4.3+tomcat入门部署

    solr4.3的入门配置   目前阿帕奇官方仅推荐2个比较稳定的版本一个是4.3的版本,一个3.6的版本     3.6的版本没有用过,所以在此无涉及,下面就来说说solr4.3的入门配置     s ...

  8. JSP,PHP详细性能测试

    前几天在CU看到有人比较PHP与JSP,.net,结果表明PHP比JSP,.net性能低下很多.本人认为即使有差距,也不应该有这么大,所以认真测试一下几者间的性能差距.由于很久没用.net了,所以,暂 ...

  9. Hyperledger Fabric开发

    打开Hyperledger Fabric在线开发文档:https://hyperledger-fabric.readthedocs.io 建议在Mac或Linux环境下操作,因为文档基本上是按照Mac ...

  10. 数字图像处理实验(16):PROJECT 06-03,Color Image Enhancement by Histogram Processing 标签: 图像处理MATLAB 2017

    实验要求: Objective: To know how to implement image enhancement for color images by histogram processing ...