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

         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. 【最短路径之dijkstra(迪杰斯特拉)算法】

    这一章主要介绍最短路径的算法之一,dijkstra算法. 概念 :迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点 ...

  2. py+appium微信公众号自动化(已搞定多个坑)

    最近需要做微信公众号的自动化测试,遇到了不少坑. 微信公众号自动化与app自动化还是有区别的,因为多了不少坑.打开微信x5内核调试的就不说了,百度有. 1.首先,微信公众号有webview,uiaut ...

  3. Excel催化剂开源第30波-在Excel上尽情地使用LINQ

    对于笔者这样的数据分析工作者来说,对数据库有较深的掌握,当然少不了对SQL查询的深度使用,如果在编程的世界中,可以复用这样的能力,真的是一件多么令人高兴的事情. 在.Net的世界中,恰恰提供了这样的能 ...

  4. Masstransit的应用服务总线

    Masstransit 是一个非常优秀的基于消息进行通信的分布式应用程序框架,详情参考官网. 在介绍AA.ServiceBus之前,先介绍下几个概念. 分布式 分布式系统如何定义?这里引用一下Dist ...

  5. java - 进程和线程的区别及联系

    1. 进程 (1)进程主要有两个特征: a. 进程是一个实体,占有一定的地址空间.每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region).数据区域(data region) ...

  6. jango简介

    Django简介   Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Mode ...

  7. 第三章 jsp数据交互(二)

    Application:当前服务器(可以包含多个会话):当服务器启动后就会创建一个application对象,被所有用户共享page.request.session.application四个作用域对 ...

  8. 初识web

    人得往前走啊 所以学学web 动态网页是指在服务器端运行的,使用程序语言设计的交互式网页,它们会根据某种条件的变化,返回不同的网页内容.可以让用户和服务器交互的网站.然而动态网站并不是指具有动画功能的 ...

  9. ld: library not found for -

    这几天在做微信登录,总是遇到这个问题,详细如下: ld: library not found for -lWeChatSDK clang: error: linker command failed w ...

  10. [重磅开源] 比SingleR更适合的websocket 即时通讯组件---ImCore开源了

    有感而发 为什么说 SignalR 不合适做 IM? IM 的特点必定是长连接,轮训的功能用不上. 因为它是双工通讯的设计,用hub.invoke发送命令给服务端处理业务,其他就和 ajax 差不多, ...