开篇先不讲解,如何判断用户是否登陆,我们先来看用户登录的部分代码,账户密码都正确后,先将当前登录的用户名记录下来。

         public ActionResult ProcessLogin()
{
try
{
string user_name = Request["LoginId"];
string user_pwd = Request["LoginPwd"];
UserInfo model = new UserInfo();
model.UName = user_name;
model.UPwd = user_pwd;
if (bllSession.UserInfo.Select(model).Count > ) //判断用户名密码是否正确
{
Session["loginUser"] = user_name; //记录当前登录的用户名
return Content("ok");
}
else
{
return Content("用户名或密码错误!你会登陆吗?");
}
}
catch (Exception ex)
{
throw ex;
}
}

下面开始演示校验用户登录几种方式

方式一

  在每个页面执行前判断当前用户是否登陆,若登陆才可以进入当前页面,没有登陆则跳回首页,网站页面少的话,可以在每个页面上添加此方法,随着项目模块越来越多,你还会想怎么复制粘贴嘛?Don't repeat youself!

         public ActionResult Index()
{
if (Session["loginUser"] == null)
{
return RedirectToAction("Index", "UserLogin");
}
return View();
}

方式二

  全局过滤器中校验用户是否登陆

创建一个校验类(LoginCheckFilterAttribute.cs)

 using System.Web.Mvc;

 namespace Sam.OA.WEBAPP.Models
{
/// <summary>
/// 校验用户是否登陆帮助类
/// </summary>
public class LoginCheckFilterAttribute: ActionFilterAttribute //注意继承:ActionFilterAttribute
{
/// <summary>
/// 是否校验,默认为true
/// </summary>
public bool IsChecked { get; set; }
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
//校验用户是否已登录
if (IsChecked)
{
if (filterContext.HttpContext.Session["loginUser"] == null)
{
filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
}
}
}
}
}

在全局过滤器中添加这方法(FilterConfig.cs)

 using Sam.OA.WEBAPP.Models;
using System.Web.Mvc; namespace Sam.OA.WEBAPP
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
filters.Add(new MyExceptionFilterAttribute()); //自定义的过滤规则 //校验用户是否登陆,默认为校验
filters.Add(new LoginCheckFilterAttribute() { IsChecked=true});
}
}
}

这样一来 ,所有的页面都会校验用户是否登陆,可实际中偏偏有些地方是不需要校验用户是否登陆的,比如:登陆页面,此时我们如何解决这个问题呢?我们可以给类打上标签

用户登录控制器(UserLoginController.cs)

 using Sam.OA.BLLFactory;
using Sam.OA.Model.Sam;
using Sam.OA.WEBAPP.Models;
using System;
using System.Web.Mvc; namespace Sam.OA.WEBAPP.Controllers
{
/// <summary>
/// 打上标签,不校验用户是否登陆
/// </summary>
[LoginCheckFilterAttribute(IsChecked =false)]
public class UserLoginController : Controller
{
// GET: UserLogin
public ActionResult Index()
{
return View();
}
IBllSession bllSession = BllSessionFactory.GetCurrentBllSession();
/// <summary>
/// 处理登陆的表单
/// </summary>
/// <returns></returns>
public ActionResult ProcessLogin()
{
try
{
string user_name = Request["LoginId"];
string user_pwd = Request["LoginPwd"];
UserInfo model = new UserInfo();
model.UName = user_name;
model.UPwd = user_pwd;
if (bllSession.UserInfo.Select(model).Count > ) //判断用户名密码是否正确
{
Session["loginUser"] = user_name;
return Content("ok");
}
else
{
return Content("用户名或密码错误!你会登陆吗?");
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}

这样一来问题完美的解决了,不需要校验用户是否登陆的地方打上标签~~~~

方式三

手动创建一个控制器基类(BaseController.cs)

 using System.Web.Mvc;

 namespace Sam.OA.WEBAPP.Controllers
{
/// <summary>
/// 控制器基类帮助类
/// 作者:陈彦斌
/// 时间:2019年8月22日23:53:35
/// </summary>
public class BaseController:Controller
{
public bool IsCheckedUserLogin = true;
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
//校验用户是否已登录
if (IsCheckedUserLogin )
{
if (filterContext.HttpContext.Session["loginUser"] == null)
{
filterContext.HttpContext.Response.Redirect("/UserLogin/Index");
}
}
}
}
}

此时,我们需要做校验的控制器全部改写成继承控制器基类

 using Sam.OA.BLLFactory;
using Sam.OA.Model.Sam;
using System.Web.Mvc; namespace Sam.OA.WEBAPP.Controllers
{
/// <summary>
/// 从继承:Controller改为继承基类:BaseController
/// </summary>
public class UserInfoController : BaseController //:Controller
{
// GET: UserInfo
IBllSession bll = BllSessionFactory.GetCurrentBllSession();
public ActionResult Index()
{
UserInfo model = new UserInfo();
ViewData.Model = bll.UserInfo.Select(model,"1=1");
return View();
}
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(UserInfo model)
{
if (ModelState.IsValid)
{
bll.UserInfo.Add(model);
}
return RedirectToAction("Index");
}
}
}

那么问题又来了,有些页面不校验如何做呢?要么不继承基类,要么按照下面方法配置,是不是感觉很灵活嘞

 using Sam.OA.BLLFactory;
using Sam.OA.Model.Sam;
using System;
using System.Web.Mvc; namespace Sam.OA.WEBAPP.Controllers
{
public class UserLoginController :BaseController //:Controller
{
public UserLoginController()
{
this.IsCheckedUserLogin = false; //不校验用户是否登陆
}
// GET: UserLogin
public ActionResult Index()
{
return View();
}
IBllSession bllSession = BllSessionFactory.GetCurrentBllSession();
/// <summary>
/// 处理登陆的表单
/// </summary>
/// <returns></returns>
public ActionResult ProcessLogin()
{
try
{
string user_name = Request["LoginId"];
string user_pwd = Request["LoginPwd"];
UserInfo model = new UserInfo();
model.UName = user_name;
model.UPwd = user_pwd;
if (bllSession.UserInfo.Select(model).Count > ) //判断用户名密码是否正确
{
Session["loginUser"] = user_name;
return Content("ok");
}
else
{
return Content("用户名或密码错误!你会登陆吗?");
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}

以上所有问题都已经完美解决~

.Net Mvc判断用户是否登陆、未登陆跳回登陆页、三种完美解决方案的更多相关文章

  1. ios 判断用户是否开启权限---并跳转设置

    ios 判断用户是否开启权限---并跳转设置 ios 判断用户是否开启权限---并跳转“系统设置” 1.判断 访问相册 或 相机 权限是否开启 2.检测是否开启定位 后面将持续更新 只有在应用请求过位 ...

  2. vue 判断是否登录,未登录跳转到登录页

    网页一进入判断是否登录,未登录跳转到登录页面 router.js export default new Router({ routes: [ { path: '/', name: 'HelloWorl ...

  3. DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证

    本篇文档学习,DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证 1.取消MRP进程 备库查询进程状态select process,client_process,sequen ...

  4. shiro控制登陆成功后跳回之前的页面

    登陆之后跳回之前的页面是在做登陆注册模块时遇到的一个需求,也是很有必要的.若用户直接访问登陆页面,那可以控制它直接到首页,但是要用户没有登陆直接访问自己的购物车等需要经过身份认证的页面,或者因为ses ...

  5. 判断用户Input输入的事件来进行登陆

    我们是通过键盘按的object.keyCode获取的 Html <input onkeydown="keydownMsg(event)" type="text&qu ...

  6. php如何判断用户是从指定页面跳转进来的

    $_SERVER['HTTP_REFERER']下'HTTP_REFERER' 引导用户代理到当前页的前一页的地址(如果存在).由 user agent 设置决定.并不是所有的用户代理都会设置该项,有 ...

  7. Vue-router路由判断页面是否登录,未登录跳转到登录页面

    在index.js中 //定义路由 const router = new Router({ routes, strict: process.env.NODE_ENV !== 'production', ...

  8. 关于SQLServer数据库中字段值为NULL,取出来该字段放在DataTable中,判断datatable中该字段值是否为NULL的三种方法

    1. DataTable dt;                               //假设字段为name, dt已经保存了数据dt.rows[0]["name"] == ...

  9. 关于判断是安卓还是ios环境跳转下载页

    H5项目中判断是安卓还是iOS手机就跳转到不同的下载页,项目如下https://github.com/JserJser/dailyPush/tree/master/daily6/H5 这个项目里面我比 ...

随机推荐

  1. Spring Cloud 之 Zuul基础.

    一.概述  API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤 ...

  2. Dubbo服务注册与发现

    目录 一.分布式基本理论 1.1.分布式基本定义 1.2 架构发展演变 1.3.RPC简介 二.Dubbo理论简介 三.Dubbo环境搭建 3.1 Zookeeper搭建 3.2 Dubbo管理页面搭 ...

  3. 洛谷P2057 [SHOI2007]善意的投票 题解

    题目链接: https://www.luogu.org/problemnew/show/P2057 分析: 由0和1的选择我们直觉的想到0与S一堆,1与T一堆. 但是发现,刚开始的主意并不一定是最终的 ...

  4. NOIp2018普及组T3暨洛谷P5017 摆渡车:题解

    题目链接:https://www.luogu.org/problemnew/show/P5017 emm,这次的真的不简单的,T3比T4难? 醉了... 蒟蒻肯定没有其他大佬讲的好啊,但肯定尽力,真的 ...

  5. c++小游戏——杀手

    杀手小游戏 会有一个存活者:(1 2 3 4 5),如果出现(1 0 3 4 5),代表二号已经死了. 一号有3次复活权 且有一次随机诅咒权(即当自己被杀死时,会随机诅咒另外一个人,当然不是死人或自己 ...

  6. jenkins +Jmeter 完成分布式性能测试

    1.Jmeter 压测机器配置. 下载Jmeter 版本:https://jmeter.apache.org/download_jmeter.cgi   我下的是5.1.1 将下载后的版本进行解压. ...

  7. Linux AUFS 文件系统

    AUFS 的英文全称为 Advanced Mult-Layered Unification Filesystem,曾经是 Another Mult-Layered Unification Filesy ...

  8. PHP使用array_unique对二维数组去重处理

    去重,点这里,东西是好东西,就是有点懒.莫见怪

  9. Java实现常见的排序算法

    一.排序算法 常见的排序算法主要分为下面几类: 选择排序 堆排序 冒泡排序 快速排序 插入排序 希尔排序 归并排序 桶式排序 基数排序 本文主要介绍选择排序.堆排序.冒泡排序.快速排序和归并排序的原理 ...

  10. 【iOS】打印方法名

    为了便于追踪程序运行过程,可以在日志打印方法名,示例代码如下: NSLog(@"%@", NSStringFromSelector(_cmd)); 结果如图所示: 此外,在多个中, ...