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

         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. Golang 高效实践之并发实践context篇

    前言 在上篇Golang高效实践之并发实践channel篇中我给大家介绍了Golang并发模型,详细的介绍了channel的用法,和用select管理channel.比如说我们可以用channel来控 ...

  2. 最全面阐述WebDataBinder理解Spring的数据绑定

    每篇一句 不要总问低级的问题,这样的人要么懒,不愿意上网搜索,要么笨,一点独立思考的能力都没有 相关阅读 [小家Spring]聊聊Spring中的数据绑定 --- DataBinder本尊(源码分析) ...

  3. UVA-10608 Friends 【并查集】

    There is a town with N citizens. It is known that some pairs of people are friends. According to the ...

  4. Windows下ElasticSearch的Head安装及基本使用

    前段时间,有一朋友咨询我,说es的head插件一直安装失败,为了给朋友解惑,自己百度博文并实践了一番,也的确踩了些坑,但我给爬了起来.今天就来分享下实践心得并跳过的坑. ElasticSearch 是 ...

  5. Git设置忽略文件

    在向代码仓库提交的时候,一般需要忽略掉一些文件或目录,比如Eclipse工程的配置文件,Maven工程的target目录,以及.log日志文件等等. 这个问题在Git中解决起来也很简单:在Git工作区 ...

  6. 使用RabbitMQ做数据接收和处理时,自动关闭

    场景:N个客户端向MQ里发送数据:服务器上有另一个控制台程序(假设叫ServerClient)来处理这里数据(往数据库保存).方向为Client * n→MQSERVER→ServerClient 问 ...

  7. CentOS 下编译安装PHP

    1.   去php官网下载源码 http://www.php.net/downloads.php ,我下载使用的版本是(php-5.4.8.tar.gz) 2.   安装环境 yum install ...

  8. win7 开机网络等待,应用打不开的解决方案

    状况描述:最近,笔记本电脑开机之后,网络图标一直转圈,任何应用程序也打不开,开机关机还是可以的,之前是偶尔发生这种情况,然后重启一下或许就行了,但最近每次开机都是这个情况,很恼火,在网上百度了很久,有 ...

  9. 初始Spring 文档 完整版

    初始Spring 1.Spring官网 spring.io 01. IOC(Inverse of Control)控制反转 02. AOP(Aspect Oritend Programming)面向切 ...

  10. Angular JS 中的内置方法之filter

    通过过滤器可以实现很多数据格式化的功能 常用方法形如{{ data | uppercase}} 或者是{{ 123.456 | number:2 }} 也可以通过在控制器中注入$filter来实现功能 ...