MVC之ActionFilterAttribute

1、登录页面代码:

@{
    ViewBag.Title = "会员登录";
    Layout = "~/Views/Shared/_LayoutDialog.cshtml";
}

<div class="loginBox">
    <div class="loginHead" >
        会员登录
    </div>
    <form id="hgl-form" class="form-horizontal" action="@Url.Action("Login", "Home", new { area = string.Empty })" method="post">
        <div class="control-group">
            <label for="inputEmail">账户</label>
            <input type="text" name="account" id="inputEmail" class="validate[required]" />
        </div>
        <div class="control-group">
            <label for="inputPassword">密码</label>
            <input type="password" name="password" id="inputPassword" class="validate[required]" />
        </div>
        @*<div class="control-group" >
                    <label class="checkbox">
                        <input type="checkbox" name="rememberMe" checked>
                        记住我</label>
                </div>*@
        <div class="form-actions">
            <button type="submit" class="btn btn-block">登录</button>
        </div>
    </form>

</div>

@section scripts{    <script type="text/javascript">        $(function () {            //表单提交            hgl.sumbit(function () {                location.href = ‘@Url.Action("Index", "SiteSet", new { area = "Setting" })‘;//登陆成功后跳转到的页面            });        })    </script>}

  2、登录controller代码:

        //会员登录
        [HttpGet]
        public ActionResult Login()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Login(string account, string password)
        {
            var entity = AdminService.QueryDetailForAccount(account);
            if (entity == null)
                return JRFaild("all", "此账户不存在");

            if (entity.Password != password.ToMD5())
                return JRFaild("all", "账户密码输入错误,请重新输入");

            if (entity.Freezed == 1)
                return JRFaild("all", "此账户已被冻结,暂不能登录,请联系超级管理员");

            var result = AdminService.Login(account, password, entity);

            if (result)
            {
                Session["account"] = account;                Session["guid"] = entity.Guid;                Session["username"] = entity.Name;                Session["password"] = password;

                return JRSuccess("登录成功");
            }

            return JRFaild("all", "登录失败,用户名或密码错误或账户不存在");
        }

  前面是登录模块的代码;下面主要介绍 ActionFilterAttribute过滤器的使用

1、在项目中新建个Filter文件夹,在文件夹里面添加该过滤器类,命名为:BasicAuthAttribute.cs;此类需要继承ActionFilterAttribute(关于ActionFilterAttribute大家可以按F12跳转到该类的详细介绍进行了解和使用);我在新建的BasicAuthAttribute.cs中使用了OnActionExecuting,该类代码如下:如下代码在使用的时候还需要添加引用:

using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
namespace Linkin.Manager.Filter
{
    public class BasicAuthAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var account = filterContext.HttpContext.Session["account"];            var password = filterContext.HttpContext.Session["password"];            if (account == null || password == null)
            {
                //用户不登陆的时候跳转到登录页面
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Home", action = "Login", area = string.Empty }));
            }
        }
    }
}

到此为止,过滤器已经写好了,具体的项可以直接F12到起定义进行查看,可以看出当用户不登陆的时候会跳转到登录页面

2、此时需要到配置文件里的登录配置是怎么配置的,打开web.config,找到节点<authentication mode="Forms"></authentication>查看配置,如果自己的登录页面跟web.config里面的配置一样就不需要修改了,不一致的最好修改一下

    <!--这里配置的是登录页面的权限配置-->
    <authentication mode="Forms">
      <forms loginUrl="~/Home/Login" timeout="2880"   />
    </authentication>

3、这样以后在controller里面就可以直接用该过滤器了,在要使用此项过滤器的controller里面直接加入下面的红色字体,此时这样还需要引入该文件的引用:using Linkin.Manager.Filter;(此引用要根据自己的项目的实际情况来添加)代码如下:

   [BasicAuthAttribute]
    public class AdminController : BasicController
    {
        [HttpGet]
        public ActionResult Index(string id, string key, int state = -1, int page = 1)
        {
            ViewBag.Id = id;
            ViewBag.Key = key;
            ViewBag.State = state;
            return View(AdminService.QueryPageList(id, key, state, page, 10));
        }
   }

上面的代码是将起放到了外面,也可以将起直接放到里面,如下:

public class AdminController : BasicController
    {
        [BasicAuthAttribute]
        [HttpGet]
        public ActionResult Index(string id, string key, int state = -1, int page = 1)
        {
            ViewBag.Id = id;
            ViewBag.Key = key;
            ViewBag.State = state;
            return View(AdminService.QueryPageList(id, key, state, page, 10));
        }
  }

4、经过以上的步骤就弄好了,此时运行网站,在不登陆的时候,直接在浏览器的地址栏输入http://localhost:2341/setting/admin,此时可以看到页面跳转到了登录页面

时间: 2024-10-10 20:45:15

MVC之ActionFilterAttribute的相关文章

MVC中ActionFilterAttribute用法并实现统一授权

MVC中ActionFilterAttribute经常用来处理权限或者统一操作时的问题. 先写一个简单的例子,如下: 比如现在有一个用户管理中心,而这个用户管理中心需要登录授权后才能进去操作或浏览信息,这个时候我们不可能每一个页面都写一遍权限的判断,这个时候就需要我们进行统一判断权限,那么怎么统一权限呢?如果你了解MVC那么下面的代码应该很容易看懂,否则还是先看一下MVC基础吧. 1.创建一个类(用来检查用户是否登录和用户权限)代码如下: // 过滤器    public class Membe

ASP.NET MVC 利用ActionFilterAttribute来做权限等

www.cnblogs.com/waitingfor/archive/2011/12/27/2303784.html ActionFilterAttribute是Action过滤类,该属于会在执行一个action之前先执行.而ActionFilterAttribute是 MVC的一个专门处理action过滤的类.基于这个原理 我们做一个权限限制 例如:如何访问 HomeController  里的test  action using System;using System.Collections

mvc通过ActionFilterAttribute做登录检查

1.0 创建Attribute using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace LSUnion.Site.WebHelper { [AttributeUsage(AttributeTargets.Class|AttributeTargets.Method,AllowMultiple=false)] public class CheckAdminLoginA

MVC 过滤器 ActionFilterAttribute

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using 过滤器.Controllers; namespace 过滤器.Filtes{ public class MyActionFiterAttribute:ActionFilterAttribute { /// <summary> /// Action过滤器 执行方法之前/// <

ASP.NET MVC 通过ActionFilterAttribute来实现防止重复提交

实现思想:每个页面打开的时候会在页面的隐藏控件自动生成一个值并将这个值赋值session,当提交方法的时候会在过滤器的时候进行获取session和页面传值过来的隐藏控件的值进行比较,如果值相同的话,重写session值.否则的话给出提示. ActionFilter: using System;using System.Web;using System.Web.Mvc;using EwayFramework.Utils.Token; namespace EwayFramework.BaseCont

MVC中验证登录和权限

用mvc做后台管理系统,必然会要做登录和权限判断.这里是用mvc的ActionFilterAttribute特性. 具体如下: 声明一个CheckUser类,继承ActionFilterAttribute类 public class CheckUserFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActio

[翻译] 使用ASP.NET MVC操作过滤器记录日志

[翻译] 使用ASP.NET MVC操作过滤器记录日志 原文地址:http://www.singingeels.com/Articles/Logging_with_ASPNET_MVC_Action_Filters.aspx 翻译:Anders Liu 摘要:日志记录是一种常见的交错关注点(Cross-Cutting Concern),很多ASP.NET开发者会在Global.asax文件中处理它.由于MVC是构建在ASP.NET之上的,所以你可以使用同样的解 决方式,但还有更好的方法.这篇文章

WebApi 服务监控

本文主要介绍在请求WebApi时,监控Action执行的时间,及Action传递的参数值,以及Http请求头信息.采用log4net记录监控日志,通过日志记录的时间方便我们定位哪一个Action执行的时间过长,进而采取优化的手段. 监控日志监控的指标如下图 监控程序实现 改监控程序主要继承ActionFilterAttribute类,在命名空间:System.Web.Http.Filters中,重写OnActionExecuted(HttpActionExecutedContext action

陨石坑之webapi使用filter

首先为什么说这是一个坑,是因为我们在webapi中使用filter的时候也许会先百度一下,好吧,挖坑的来了,我看了好几篇文章写的是使用System.Web.Mvc.Filters.ActionFilterAttribute. 然后开始痛苦的调试,发现这个过滤器永远调不进来(windows azure mobile services除外).then.... 还是Google吧 ! 痛苦后才懂,原来不是这么一回事,ActionFilterAttribute 有2个不同的版本,一个在System.We