.Net Mvc判断用户是否登陆、未登陆跳回登陆页、三种完美解决方案
开篇先不讲解,如何判断用户是否登陆,我们先来看用户登录的部分代码,账户密码都正确后,先将当前登录的用户名记录下来。
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判断用户是否登陆、未登陆跳回登陆页、三种完美解决方案的更多相关文章
- ios 判断用户是否开启权限---并跳转设置
ios 判断用户是否开启权限---并跳转设置 ios 判断用户是否开启权限---并跳转“系统设置” 1.判断 访问相册 或 相机 权限是否开启 2.检测是否开启定位 后面将持续更新 只有在应用请求过位 ...
- vue 判断是否登录,未登录跳转到登录页
网页一进入判断是否登录,未登录跳转到登录页面 router.js export default new Router({ routes: [ { path: '/', name: 'HelloWorl ...
- DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证
本篇文档学习,DG备库,实时应用如何判断,MR进程,及MRP应用归档,三种情况的查询及验证 1.取消MRP进程 备库查询进程状态select process,client_process,sequen ...
- shiro控制登陆成功后跳回之前的页面
登陆之后跳回之前的页面是在做登陆注册模块时遇到的一个需求,也是很有必要的.若用户直接访问登陆页面,那可以控制它直接到首页,但是要用户没有登陆直接访问自己的购物车等需要经过身份认证的页面,或者因为ses ...
- 判断用户Input输入的事件来进行登陆
我们是通过键盘按的object.keyCode获取的 Html <input onkeydown="keydownMsg(event)" type="text&qu ...
- php如何判断用户是从指定页面跳转进来的
$_SERVER['HTTP_REFERER']下'HTTP_REFERER' 引导用户代理到当前页的前一页的地址(如果存在).由 user agent 设置决定.并不是所有的用户代理都会设置该项,有 ...
- Vue-router路由判断页面是否登录,未登录跳转到登录页面
在index.js中 //定义路由 const router = new Router({ routes, strict: process.env.NODE_ENV !== 'production', ...
- 关于SQLServer数据库中字段值为NULL,取出来该字段放在DataTable中,判断datatable中该字段值是否为NULL的三种方法
1. DataTable dt; //假设字段为name, dt已经保存了数据dt.rows[0]["name"] == ...
- 关于判断是安卓还是ios环境跳转下载页
H5项目中判断是安卓还是iOS手机就跳转到不同的下载页,项目如下https://github.com/JserJser/dailyPush/tree/master/daily6/H5 这个项目里面我比 ...
随机推荐
- Sublime Text 3 实现C++代码的编译和运行
在数据结构代码的编写中,我选用了优秀的编辑器 Sublime Text 3,但是在实现C++代码的编译和运行上费了一番周折,接下来我贴出 C++ 编译系统的代码,供各位参考. 编译后是在弹出的CMD命 ...
- Mask-RCNN:教你如何制作自己的数据集进行像素级的目标检测
概述 Mask-RCNN,是一个处于像素级别的目标检测手段.目标检测的发展主要历程大概是:RCNN,Fast-RCNN,Fster-RCNN,Darknet,YOLO,YOLOv2,YOLO3(参考目 ...
- 基于ng-zorro的ASP.NET ZERO前端实现
Abp官方提供的企业版(ASP.NET ZERO)[以下简称Zero]模板中前端使用的是Metronic,本篇博客介绍使用ng-zorro和ng-alain替换官方前端,以及使用官方生成器自动生成代码 ...
- C#中线程间操作无效: 从不是创建控件 txtBOX 的线程访问它。
delegate void 委托名(方法名); void 方法名() { if(txtBox.invokeRequered) { 委托名 d=new 委托名(); txtBox.invoke(d); ...
- Simple TPU的设计和性能评估
深度学习飞速发展过程中,人们发现原有的处理器无法满足神经网络这种特定的大量计算,大量的开始针对这一应用进行专用的硬件设计.谷歌的张量处理单元(Tensor Processing Unit,后文简称TP ...
- jProfiler远程连接Linux监控jvm、tomcat运行状态
第一步.下载软件 官网地址:https://www.ej-technologies.com/download/jprofiler/files , Mac客户端 GUI界面 Linux服务端 第二步.安 ...
- 【Demo 1】基于object_detection API的行人检测 3:模型训练并在OpenCV调用模型
训练准备 模型选择 选择ssd_mobilenet_v2_coco模型,下载地址(https://github.com/tensorflow/models/blob/master/research/o ...
- 「玩转Python」打造十万博文爬虫篇
前言 这里以爬取博客园文章为例,仅供学习参考,某些AD满天飞的网站太浪费爬虫的感情了. 爬取 使用 BeautifulSoup 获取博文 通过 html2text 将 Html 转 Markdown ...
- Win常用软件
本节只适合windows系统 VScode 下载 安装 双击安装 打开目录方式 右键文件夹->使用VSCode打开 命令行打开 code folder [dzlua@win10:~]$ ls a ...
- XSS危害——session劫持(转载)
在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍 ...