博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC用户登录(Memcache存储用户登录信息)
阅读量:4947 次
发布时间:2019-06-11

本文共 5260 字,大约阅读时间需要 17 分钟。

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

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

1、视图部分

@{    Layout = null;}    XX商城后台管理系统登录                            
@using (Ajax.BeginForm("CheckLogin", new { }, new AjaxOptions() { OnSuccess = "afterLogin" }, new { id = "loginForm" })) {

请使用OA系统账号登录

账号:
密码:
验证码:
找回密码 记住我
}

请从左侧输入登录账号和密码登录

如果遇到系统问题,请联系网络管理员。

如果没有账号,请联系网站管理员。

......

Copyright ? 2012 Yilian.com

登录页面展示:

 

2、控制器部分

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(4); 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; }        ///         /// 执行控制器方法之前先执行该方法        /// 获取自定义SessionId的值,然后从Memcache中取出        ///         ///         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
(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();        }    }}

 

三、源码下载:

 

转载于:https://www.cnblogs.com/zxx193/p/5073831.html

你可能感兴趣的文章
C#jbox小节
查看>>
结构体指针释放的问题
查看>>
C#枚举Enum[轉]
查看>>
第三百五十七天 how can I 坚持
查看>>
【动态规划】流水作业调度问题与Johnson法则
查看>>
startActivityForResult不起作用
查看>>
Python&Selenium&Unittest&BeautifuReport 自动化测试并生成HTML自动化测试报告
查看>>
活现被翻转生命
查看>>
POJ 1228
查看>>
SwaggerUI+SpringMVC——构建RestFul API的可视化界面
查看>>
springmvc怎么在启动时自己执行一个线程
查看>>
流操作的规律
查看>>
Python基础学习15--异常的分类与处理
查看>>
javascript运算符的优先级
查看>>
React + Redux 入门(一):抛开 React 学 Redux
查看>>
13位时间戳和时间格式化转换,工具类
查看>>
vue router-link子级返回父级页面
查看>>
C# 通知机制 IObserver<T> 和 IObservable<T>
查看>>
Code of Conduct by jsFoundation
查看>>
div 只显示两行超出部分隐藏
查看>>