MVC使用Controller代替Filter完成登录验证(Session校验)学习笔记5_实用技巧

之前的学习中,在对Session校验完成登录验证时,通常使用Filter来处理,方法类似与前文的错误日志过滤,即新建Filter类继承ActionFilterAttribute类,重写OnActionExecuting方法,之后直接在需要验证的Action前加上Filter标记即可。

1. 新建登陆校验类CheckLoginAttribute

using System.Web.Mvc;

namespace PMS.WebApp.Models
{
  public class CheckLoginAttribute:ActionFilterAttribute
  {
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      base.OnActionExecuting(filterContext);
      if (filterContext.HttpContext.Session == null || filterContext.HttpContext.Session["user"] == null)
      {
        filterContext.HttpContext.Response.Redirect("/User/Login");
      }
    }
  }
}

2. 在需要校验的Action增加标记以完成校验

using System.Web.Mvc;
using PMS.IBLL;
using PMS.WebApp.Models;

namespace PMS.WebApp.Controllers
{
  public class UserController : Controller
  {
    //
    // GET: /User/
    //private IUserService _userService;
    //private IUserService UserService
    //{
    //  get { return _userService ?? (_userService = new UserService()); }
    //  set { _userService = value; }
    //}
    private IUserService UserService { get; set; }
    [CheckLogin]
    public ActionResult Index()
    {
      return Content("OK");
    }

  }
}

注意:不要在RegisterGlobalFilters方法中注册校验类,否则则会相当于给所有Action都添加了校验

这种方法使用起来需要在每个Action方法前添加过滤标签,且效率并不十分高,我们的项目中使用的是一种更为简单高效的方法:使用Controller进行登录验证

1.  新建一个用于验证的Controller父类,并在其内重写OnActionExecuting方法完成登陆校验:

using System.Web.Mvc;

namespace PMS.WebApp.Controllers
{
  public class FilterController : Controller
  {
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      base.OnActionExecuting(filterContext);
      if (Session["user"] == null)
      {
        //filterContext.HttpContext.Response.Redirect("/User/Login");
        filterContext.Result = Redirect("/User/Login");
      }
    }
  }
}

在Controller校验类的OnActionExecuting方法中,有如下代码

//filterContext.HttpContext.Response.Redirect("/User/Login");
filterContext.Result = Redirect("/User/Login");      

我们使用后者而放弃前者的原因是,ASP.NET MVC中规定,Action必须返回ActionResult,如果使用前者,在完成跳转前会先进入到请求的页面,这样不符合我们使用过滤器的初衷。

2.  然后使需要校验的Controller继承于我们定义的校验Controller即可完成全局登录校验操作:

using System.Web.Mvc;
using PMS.IBLL;

namespace PMS.WebApp.Controllers
{
  public class UserController : FilterController//Controller
  {
    //
    // GET: /User/
    //private IUserService _userService;
    //private IUserService UserService
    //{
    //  get { return _userService ?? (_userService = new UserService()); }
    //  set { _userService = value; }
    //}
    private IUserService UserService { get; set; }
    //[CheckLogin]
    public ActionResult Index()
    {
      return Content("OK");
    }

  }
}

下面我们对比两种方法的优缺点

      Filter定义过程比较复杂,效率也稍低些,但是却可以对每一个Action进行单独的过滤,同一Action也可以有多条过滤信息,使用比较灵活。

      Controller定义更为简便,效率高,但是却只能对整个Controller中所有方法进行过滤,同一Controller也不太容易有多个Controller过滤父类。

     综上所述,实际项目中大多需求都是同一Controller下所有方法都需要完成登陆验证,所以其实使用Controller过滤更为高效,应对复杂需求时,灵活混用两种方法也不失为一种好的策略。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索filter
, session
, mvc
, controller
登录验证
,以便于您获取更多的相关知识。

时间: 2024-10-31 20:39:46

MVC使用Controller代替Filter完成登录验证(Session校验)学习笔记5_实用技巧的相关文章

MVC使用Spring.Net应用IOC(依赖倒置)学习笔记3_实用技巧

      到现在,我们已经基本搭建起了项目的框架,但是项目中还存在一个问题,就是尽管层与层之间使用了接口进行隔离,但实例化接口的时候,还是引入了接口实现类的依赖,如下面的代码: private IUserService _userService; private IUserService UserService { get { return _userService ?? (_userService = new UserService()); } set { _userService = va

MVC使用T4模板生成其他类的具体实现学习笔记2_实用技巧

在前篇中我们已经将User类中的代码做了具体的实现,但仍然有多个实体类未实现,以后可能还会增加新的数据表,数据表结构也有可能发生变化,所以我们使用T4模板来完成类的生成,这样就算数据库表发生了改变,也会自动根据改变后的实体对类进行重新生成. 下面是数据访问层的T4模板文件 Dal.tt <#@ template language="C#" debug="false" hostspecific="true"#> <#@ inclu

MVC使用极验验证制作登录验证码学习笔记7_实用技巧

       在之前的项目中,如果有需要使用验证码,基本都是自己用GDI+画图出来,简单好用,但是却也存在了一些小问题,首先若较少干扰线,则安全性不是很高,验证码容易被机器识别,若多画太多干扰线条,机器人识别率下降的同时,人眼的识别率也同步下降(震惊哭).更为重要的是,GDI+绘制的验证码一般来说也不会很美观,如果做一个炫酷的登陆界面却配了这样一个验证码,画风诡异,丑到极致.       再后来浏览网页的过程中,发现很多很多网站项目中都使用了一种叫极验验证的验证码,采用移动滑块的方式进行验证,方

ASP.NET MVC学习笔记_实用技巧

网上关于ASP.NET MVC的系列教程有好几个,所以就不从头开始介绍了,结尾处给大家推荐了几个链接,需要的话可以从头系统的看看. 1.ASP.NET MVC介绍及与ASP.NET WebForm的区别 刚开始为了搞清楚ASP.NET MVC到底值不值得用,翻来覆去想了一个多礼拜,看了好多资料和评论,最后决定还是值得一用.MVC不是一个简单的设计模式,更像一种架构模式,或者一种思想,刚开始一听MVC想到的就是模板引擎,NVelocity,StringTempleate等,但感觉如果只是为了用模板

MVC使用Memcache+Cookie解决分布式系统共享登录状态学习笔记6_实用技巧

      为了解决单机处理的瓶颈,增强软件的可用性,我们需要将软件部署在多台服务器上启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服务器上,或通过负载均衡技术(如:DNS轮询.Radware.F5.LVS等)让多个频道共享一组服务器.当我们将网站程序分部到多台服务器上后,由于Session受实现原理的局限,无法跨服务器同步更新Session,使得登录状态难以通过Session共享.       我们使用MemCache+Cookie方案来解决分布式系统共享登录状态的问题.

MVC项目结构搭建及单个类的实现学习笔记1_实用技巧

新人刚开始学习ASP.NET MVC,若有不足之处希望能得到您的指点,不胜感激! 先来一张项目的层级结构图: Model:模型层,主要是各种类型.枚举以及ORM框架,框架完成数据库和实体类的映射.项目中选用了微软的开源ORM框架 EntityFramework 6.0 (以下简称EF),数据库则选择了微软的轻量级数据库SQL Server Compact 4.0本地数据库(简称Compact),Compact对EF支持比较完美,又属于文档型数据库,部署起来比较简洁. DAL:数据访问层,主要是对

MVC使用Log4Net进行错误日志记录学习笔记4_实用技巧

在Web应用运行过程中,我们难免会遇到程序运行异常,这个时候我们就应该将异常信息记录下来,以便开发人员和维护人员对异常原因进行还原,对异常原因进行修复.在ASP.NET平台中进行日志记录的组件也有很多,如Log4Net.CommonLogging等,我们这里选用Log4Net进行异常日志的记录. 1. 捕获异常 在ASP.NET MVC中提供了一个全局的异常处理过滤器:HandleErrorAttribute,可以通过该过滤器捕获异常信息. 我们在Models文件夹下新建类型Log4Except

Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码_实用技巧

1.用户登录 验证用户是否登录成功步骤直接忽略,用户登录成功后怎么保存当前用户登录信息(session,cookie),本文介绍的是身份验证(其实就是基于cookie)的,下面看看代码. 引入命名空间 using System.Web.Security; 复制代码 代码如下: Users ModelUser = new Users() { ID = 10000, Name = UserName, UserName = UserName, PassWord = PassWord, Roles =

使用ASP.NET MVC 4 Async Action+jQuery实现消息通知机制的实现代码_实用技巧

这两天在使用Asp.net MVC 4开发COMET消息通知机制,在后端使用异步线程对消息进行订阅,客户端通过AJAX长连接请求MVC中的ACTION,如:http://localhost/event/imageSet,即表示获取ImageSet对象的变更消息(新增,更新和删除消息). 1.事件消息的类IEventEntity<TEntity>类的定义 复制代码 代码如下: public interface IEntityEvent<TEntity>    {        //变