一、多站点共享用户信息解决方案:

采用分布式缓存Memcache模拟Session进行用户信息信息共享

1、视图部分

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAABPCAIAAAAPyjw7AAAFOUlEQVR4nO2du47UMBSG8yQpVtqVVpPSBQ/Am8yjbIu3gY4noEWk2QIJCopISIOgIRqNWAHiIopdCSEuRSiSOLZj5za2c7L5P41WGSfxZOVPduz4xFEBADGiuS8AAB1ICcjhV8qbT28PVxe2j9efBsvFr5TXLx99efP0t4lxUuacRYzn3i4UUGKQlPv9flSmcnX48+bHcCnTbRRtUzmlshFSrol+KbMs22w2ozI9XF0YReyvKXUrc840S8Hdp0fKLMvOzs7iOB6V6XQpNSvh5CrpkjLLstPT0ziOA0qpWNk4qdiZbqOKskVPt6Jpl86uU3PO6sPh9zKwSikbOUrKD88fdPS4xS2mtaNjNLHZlAysU+WdjDHFVNS1C8QspWbkKCm/vXvWIeXn10/6et+1R7JPYrupJaXKst6bbhnP022VJOQUVSpYBgYp9/v9ZrOJVYbn+Ov2e4eUh6uLm6+H7iGh0jGljpOlNAhWKijpmNZOSudDzaXgZZzy46vHHVJev3zYM06ZcxaJdlikiOZbvrtsmnfGqkPK7erknPPWDSogjhcpux/kHK4uvr1/0Tl4nnOm1mt6U97queScRfINaHNy0+BDyYXgRcq/f377yBasBEzIAOSAlIAckBKQA1ICckBKQA5ICcgBKQE5XEqZZZmrrDqG3139BCCLSynPz89deWmLo4CUa8CllHEcJ0ky2cvuJ5OdNWXruTYedC8Zx1KmaTrZS0gJShxLWRTFZC8hJShxL2VRFJeXl0mS3N7ejjrdm5TyxGA5kfG0mnBUzhCWQyy0EzETMyTupcyyLEmSNB1dTx0pZYtm/qU6j61Jj+TJ6XoIhiHuAoTBsZSTjSw81ZT6THXjDtO2Me4CBMF973uakUU4KVshkDYpoeFMuJTy5ORkspGFr3vKVvNdfemT0hJ3AQLgUspjjCxm6eh0SYmI8dnAs29ADkgJyAEpATkgJSAHpATkgJSAHJASkANSAnJQlBJrSqwcilI6W1NiOHjRPyU8ShlsTQkHU8sgJSV8SRl0TQnMd7xbeJEy+JoSkPJO4V7KOdaUMEppnBwkpzPO6ylB2oRz3g6NAOFwLOVMa0q0peyKglBeCWyQUg6NgJYz4PgNGTOtKdGS0hYFoaWnlpqyCc2BlDPgTMpZ15QYIqUpyAFSkoTQOOURa0oMaL6bKIje5htSzgwhKY9YU0INsZX8M3R0mmPtHR1IOSuEpJxhTQmELJKEkJRByDlTAsrgJEHWJqXS1MNImqxPSkCeoFL+u3cPH4KfkA4MIbSUIX8ODIFgoUDKtUOwUCDl2iFYKJBy7RAsFEg5GL8j7cfnnm4nzSklWCjLlvJ+jfa1ndI+V4xXDi1JSBmKxUspb+92u3J7t9tpu4ynjxNhBilHzaiHlJPwJ6UwUlSNspeQsgNI6VHK8m85F1h81Q7TkESwRUGorz5X57LLaTln4kZAeQdw1/HaggHNBSjLVVTn9C5nASknQVvKdhSE9oZpeVKcYeGIKtVQ5bVmfhhqQOMFyMcNWc4CUo7Ht5Rlky3abnGLObSm1KZR2qapWxeOKHe0WmGLppE5d+kCdCl7X9IOKcfjT0qtZ2M7TGO6lOaby+FSih+Saz9IWbF4KcWIj6gmBw4JFb1S2mInLAtHlFmobW87n5TzvMg5l7Jtra0CKQNC6v9XxyktURBy/4Rrd5J6P6XeW/d55Ajd5nipM6QnGC6gOk+/V4WU7iD4/wOChQIp1w7BQoGUa4dgoUDKtUOwUCDl2iFYKIjRwWfdUgIwBEgJyPEfFy7vOMRvXYkAAAAASUVORK5CYII=" alt="" />

@{
Layout = null;
} <!DOCTYPE html>
<html>
<head>
<title>XX商城后台管理系统登录</title>
<script type="text/javascript">
if (window.parent.window != window) {
window.top.location.href = "/Home/CheckLogin";
}
</script> <script src="~/Scripts/jquery-1.8.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script type="text/javascript">
function changeCheckCode() {
$("#img").attr("src", $("#img").attr("src") + 1);
} function afterLogin(data) {
if (data=="ok") {
window.location.href = "/Home/Index";
}
else
{
$("#errorMsg").text(data);
changeCheckCode();
}
} </script> <style type="text/css">
* {
padding: 0;
margin: 0;
} body {
text-align: center;
background: #4974A4;
} #login {
width: 740px;
margin: 0 auto;
font-size: 12px;
} #loginlogo {
width: 700px;
height: 100px;
overflow: hidden;
background: url('/Content/Images/login/logo.png') no-repeat;
margin-top: 50px;
} #loginpanel {
width: 729px;
position: relative;
height: 300px;
} .panel-h {
width: 729px;
height: 20px;
background: url('/Content/Images/login/panel-h.gif') no-repeat;
position: absolute;
top: 0px;
left: 0px;
z-index: 3;
} .panel-f {
width: 729px;
height: 13px;
background: url('/Content/Images/login/panel-f.gif') no-repeat;
position: absolute;
bottom: 0px;
left: 0px;
z-index: 3;
} .panel-c {
z-index: 2;
background: url('/Content/Images/login/panel-c.gif') repeat-y;
width: 729px;
height: 300px;
} .panel-c-l {
position: absolute;
left: 60px;
top: 40px;
} .panel-c-r {
position: absolute;
right: 20px;
top: 50px;
width: 222px;
line-height: 200%;
text-align: left;
} .panel-c-l h3 {
color: #556A85;
margin-bottom: 10px;
} .panel-c-l td {
padding: 7px;
} .login-text {
height: 24px;
left: 24px;
border: 1px solid #e9e9e9;
background: #f9f9f9;
} .login-text-focus {
border: 1px solid #E6BF73;
} .login-btn {
width: 114px;
height: 29px;
color: #E9FFFF;
line-height: 29px;
background: url('/Content/Images/login/login-btn.gif') no-repeat;
border: none;
overflow: hidden;
cursor: pointer;
} #txtUsername, #code, #txtPassword {
width: 191px;
} #logincopyright {
text-align: center;
color: White;
margin-top: 50px;
} a {
color: Black;
} a:hover {
color: Red;
text-decoration: underline;
}
</style> </head>
<body style="padding: 10px">
<div id="login">
<div id="loginlogo">
</div>
<div id="loginpanel">
<div class="panel-h">
</div>
<div class="panel-c">
<div class="panel-c-l">
@using (Ajax.BeginForm("CheckLogin", new { }, new AjaxOptions() { OnSuccess = "afterLogin" }, new { id = "loginForm" }))
{
<table cellpadding="0" cellspacing="0">
<tbody>
<tr>
<td align="left" colspan="2">
<h3>
请使用OA系统账号登录
</h3>
</td>
</tr>
<tr>
<td align="right">
账号:
</td>
<td align="left">
<input type="text" name="LoginCode" id="LoginCode" class="login-text" /> </td>
</tr>
<tr>
<td align="right">
密码:
</td>
<td align="left">
<input type="password" name="LoginPwd" id="LoginPwd" value="123" class="login-text" />
</td>
</tr>
<tr>
<td>
验证码:
</td>
<td align="left">
<input type="text" class="login-text" id="code" name="vCode" value="1" />
</td>
</tr>
<tr>
<td></td>
<td>
<img id="img" src="/Login/ValidateCode/?id=1" style="float: left; height: 24px;" />
<div style="float: left; margin-left: 5px; margin-top: 10px;">
<a href="javascript:void(0)" onclick="changeCheckCode();return false;">看不清,换一张</a>
</div>
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" id="btnLogin" value="登录" class="login-btn" /><a href="/Login/FindPwd">找回密码</a>
<input type="checkbox" name="checkMe" value="1" />记住我
<span id="errorMsg"></span>
</td>
</tr>
</tbody>
</table>
}
</div>
<div class="panel-c-r">
<p>
请从左侧输入登录账号和密码登录
</p>
<p>
如果遇到系统问题,请联系网络管理员。
</p>
<p>
如果没有账号,请联系网站管理员。
</p>
<p>
......
</p>
</div>
</div>
<div class="panel-f">
</div>
</div>
<div id="logincopyright">
Copyright ? 2012 Yilian.com
</div>
</div>
</body>
</html>

登录页面展示:

aaarticlea/png;base64,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" alt="" />

2、控制器部分

aaarticlea/png;base64,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" alt="" />

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace WebApp.Controllers
{
public class LoginController : Controller
{
// GET: /Login/
CZBK.HeiMaOA.IBLL.IUserInfoService userInfoService { get; set; } public ActionResult Index()
{
return View();
} #region 用户登录
public ActionResult CheckLogin()
{
string validateCode = Session["validateCode"] == null ? string.Empty : Session["validateCode"].ToString();
if (string.IsNullOrEmpty(validateCode))
{
return Content("验证码错误!");
} //清空防止暴力破解
Session["validateCode"] = null; string requestCode = Request["vCode"];
if (!requestCode.Equals(validateCode, StringComparison.InvariantCultureIgnoreCase))
{
return Content("验证码错误!");
}
string userName = Request["LoginCode"];
string userPwd = Request["LoginPwd"]; //对用户名、密码进行过滤
var userInfo = userInfoService.LoadEntities(u => u.UName == userName && u.UPwd == userPwd).FirstOrDefault();
if (userInfo == null)
{
return Content("用户名密码错误!");
}
else
{
//Session["userInfo"] = userInfo; //普通方式 #region 利用Memcache模拟Session进行共享用户Session信息
//自己创建的SessionId,作为Memcache的Key
string sessionId = Guid.NewGuid().ToString();
//将用户的信息存储到Memcache中
CZBK.HeiMaOA.Common.MemcacheHelper.Set(sessionId, CZBK.HeiMaOA.Common.SerializerHelper.SerializerToString(userInfo));
//然后将自创的SessionId以Cookie的形式返回给浏览器,存储到浏览器端的内存中。
Response.Cookies["sessionId"].Value = sessionId;
#endregion return Content("ok");
}
}
#endregion #region 展示验证码
public ActionResult ValidateCode()
{
CZBK.HeiMaOA.Common.ValidateCode validateCode = new CZBK.HeiMaOA.Common.ValidateCode();
string code = validateCode.CreateValidateCode();
Session["validateCode"] = code;
byte[] buffer = validateCode.CreateValidateGraphic(code);
return File(buffer, "image/jpeg");
}
#endregion
}
}

二、访问页面先验证用户是否登录的解决办法:

1.新建BaseController,让需要验证的继承这个控制器即可:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CZBK.HeiMaOA.Model; namespace WebApp.Controllers
{
public class BaseController : Controller
{
public UserInfo LoginUser { get; set; } /// <summary>
/// 执行控制器方法之前先执行该方法
/// 获取自定义SessionId的值,然后从Memcache中取出
/// </summary>
/// <param name="filterContext"></param>
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
bool isExt = false;
if (Request.Cookies["sessionId"] != null)
{
//获取自定义的SessionId
string sessionId = Request.Cookies["sessionId"].Value;
object obj = CZBK.HeiMaOA.Common.MemcacheHelper.Get(sessionId);
if (obj != null)
{
LoginUser = CZBK.HeiMaOA.Common.SerializerHelper.DeserializeToObject<UserInfo>(obj.ToString());
isExt = true;
}
}
if (!isExt) //用户没登录
{
filterContext.HttpContext.Response.Redirect("/Login/Index");
}
base.OnActionExecuting(filterContext);
} }
}

2.示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace WebApp.Controllers
{
public class HomeController : BaseController
{
//
// GET: /Home/ public ActionResult Index()
{
if (LoginUser != null)
{
ViewData["userName"] = LoginUser.UName;
}
return View();
} }
}

三、源码下载:

点击下载源码>>

点击下载数据库文件>>

ASP.NET MVC用户登录(Memcache存储用户登录信息)的更多相关文章

  1. ASP.NET MVC中加载WebForms用户控件(.ascx)

    原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...

  2. ASP.Net Mvc实现自定义User Identity用户身份识别系统(1)

    目的 当我们新建asp.net mvc 项目时,我们在使用下图所示的代码是否有以下思考: 1,在this.User.Identity.Name,为什么可以使用this便可以选中Name属性: 2,若项 ...

  3. ASP.NET MVC使用SignalR统计在线用户人数

    学到新东西就记录一下.也许正好有人需要~~~~~~ 由于需要记录当前在线用户,emmmm又是没做过的... 本来想用数据库的形式,但是想想这么简单的功能百度肯定有.遨游一波百度,有所收获.... 虽然 ...

  4. ASP.NET Identity系列02,在ASP.NET MVC中增删改查用户

    本篇体验在ASP.NET MVC中使用ASP.NET Identity增删改查用户. 源码在这里:https://github.com/darrenji/UseIdentityCRUDUserInMV ...

  5. ASP.NET MVC自定义AuthorizeAttribute篇知识点讲解—登录限制

    1.前言 a.微软对ASP.NET的开发从WebForm到MVC的转变,已经正式过去5,6个年头,现在WebForm和MVC也都越来越完善,小小算来我也已经工作了将近三年,从大学的时候学习ASP.NE ...

  6. asp.net mvc 自定义全局过滤器 验证用户是否登录

    一般具有用户模块的系统都需要对用户是否登录进行验证,如果用户登录了就可以继续操作,否则退回用户的登录页面 对于这样的需求我们可以通过自定义一个独立的方法来完成验证的操作,但是这样代码的重复率就大大提高 ...

  7. ASP.NET MVC应用程序中支持用户使用腾讯QQ和微信以及新浪微博的第三方登录

    什么是第三方授权登录,就是一些大家都会有的帐号如QQ.微信.淘宝.微博等账户.通过那些巨头公司提供的api直接实现登录. 当然,我们是不可能得到你的用户名和密码的.不了解的人,可能会存在这个疑虑.我们 ...

  8. ASP.Net Mvc实现自定义User Identity用户身份识别系统(2)

    上一篇博文中已经实现了如何在页面上使用自定义的属性即上篇博文所示的@this.U,今天将进一步研究用户自定义User Identity; 实现思路: 通过研究微软自带identity的套路,我们可以发 ...

  9. ASP.NET MVC 随想录——开始使用ASP.NET Identity,初级篇

    在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好的集成. 在这篇文章中,我主要关注ASP. ...

随机推荐

  1. Usaco 2019 Jan Platinum

    Usaco 2019 Jan Platinum 要不是昨天老师给我们考了这套题,我都不知道usaco还有铂金这么一级. 插播一则新闻:杨神坚持认为铂金比黄金简单,原因竟是:铜 汞 银 铂 金(金属活动 ...

  2. 「SNOI2019」通信

    题目 还好我没生在陕西啊 首先发现这个题不能\(dp\),数据范围不大,好像一种网络流的样子啊 哎等等,这样向后面连边不是一个\(DAG\)吗,这不是最小权路径覆盖的板子吗 于是我们套路的拆点,对于一 ...

  3. Qt 编程指南 4 按钮

    1按钮类的控件 逐个解释一下各个用途:(1)按压按钮 QPushButton最基本的按钮,点击该按钮通常是通知程序进行一个操作,比如弹个窗.下一步.保存.退出等等,这是经常用到的,操作系统里的对话框里 ...

  4. win7/10下Qt Creator调试提示:The selected debugger may be inappropriate for the inferior的解决办法

    在win7/10下Qt Creator调试提示:The selected debugger may be inappropriate for the inferior的错误提示内容如下图所示: 一般弹 ...

  5. 解决VC++6.0打开文件或添加文件到工程出错的问题

    相信很多朋友在安装VC++6.0之后,发现无法使用打开文件命令.同时,打开了工程,却无法实现文件添加到工程的问题.一旦进行如此操作,便会出现应用程序错误,需要关闭应用程序.为此,不胜其烦.更有甚者,以 ...

  6. Android多线程—HandlerThread解析

    一.HandlerThread作用 1.实现多线程:在工作线程之后执行任务(比如一些耗时任务) 2.异步通信.消息传递:实现工作线程与主线程(UI线程)之间的通信,即将工作线程的执行结果传递给主线程, ...

  7. arduino:int & double 转string 适合12864下使用

    转自:http://www.geek-workshop.com/forum.php?mod=viewthread&tid=3383&highlight=12864 很多人在玩的时候,都 ...

  8. android RadioGroup中设置selector后出现多个别选中的RadioButton的解决办法

    在一个RadioGroup组中假如有三个或者以上的RadioButton,当然你需要给这些RadioButton设置selector.设置其中的一个为默认选中状态(在xml中设置).当程序在手机上运行 ...

  9. statefulSet 原理理解

    1.  svc(vip)                       --              deployment 2.headless(none)                --     ...

  10. wifidog源码分析 - wifidog原理

    wifidog是一个用于配合认证服务器实现无线网页认证功能的程序,常见的情景就是使用于公共场合的无线wifi接入点,首先移动设备会连接公共wifi接入点,之后会弹出网页要求输入用户名密码,认证过后才能 ...