95992828九五至尊2

MVC管理种类,MainForm营造分布式架构

三月 19th, 2019  |  882828九五至尊手机版

本篇将要和我们分享的是三个简单易行的后台管理连串,那里首发个地方http://www.lovexins.com:8081/(登陆账号:youke,密码:123123;高级用户账号:gaoji,密码:123123)有趣味的诸位能够先不难看下效果,此系统运用:Ace的h5样式+Mvc5.0
+
redis+sqlserver+shenniu.pager.js构建形成,构建此项目初衷为了有一套自身现成的h5后台系统,为了今后能一点也不慢支付搭建部分系统;项目源码一时不开源(完善后开源),如若您的承认可照旧想商量下,能够扫博客下方二维码扶助一下拿走源码(哪怕1分钱都可),当然此小说首要目标不是为着广告,而是为了分享部分第贰依旧常用的代码处理形式,希望大家喜欢,多多支持:

本次要享用的是行使windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般标准发布的时候是在linux来布局nginx,小编那边测试分享内容只是起引导成效;上面将先交给整个架构的基本节点简介,希望各位多多点赞:

 

 

. Controller中采取自带生成的Dispose(bool)好与坏

.
架构设计图突显

. List集合生成权限树

nginx+iis创设服务集群

. 相比较集合,加载checkboxlist

. redis存储分布式共享的session及共享session运作流程

. 为什么使用redis来保存session

. redis主从布局及Sentinel管理多少个Redis集群

 

.
定时框架Task.MainForm提供数据给redis集群储存

上边一步3个脚印的来分享:

 

. Controller中应用自带生成的Dispose(bool)好与坏

以上是整整框架结构的本人以为宗旨的一对,个中没有包蕴有数据库方面的布置(请忽略),上面来规范分享前几天的小说吧(redis存款和储蓄分布式共享的session及共享session运作流程):

率先,咋们先来看下mvc模板自动生成的Dispose重写方法:

. 通晓分布式的session(个人精晓)

1        protected override void Dispose(bool disposing)
2         {
3             if (disposing)
4             {
5                 db.Dispose();
6             }
7             base.Dispose(disposing);
8         }

. 分析分布式session的萍踪浪迹进程

882828九五至尊手机版,因为Controller达成了接口IDisposable,所以里面能够应用Dispose方法,再看db.dispose()那是用来释放连接数据库对象的,假使条分缕析的爱人可以在调试的时候发现,大家在履行有个别连接数据库操作后,退出action的时候会进来这么些重新的Dispose方法中去,首要目标用来刑释在Controller最上边生成的连天数据库对象,笔者那边是:

. 封装session登录验证和剥离的公物艺术

882828九五至尊手机版 1

. Redis存款和储蓄分布式session的登录实例

来看此间个人觉吧那么些指标放在那使用起来挺方便的,可是带来叁个标题就是,假若在作业逻辑复杂的地点,直接使用那么些db,直到最终执行完全部action退出Controller的时候才dispose释放连接会不会有标题,心中存疑,再添加明天看了一篇博文,分享的内容大致有如此的字样:ef不必要动用using(原理也正是dispose)自个儿就能在操作完数据库后释放,原因底层已经完成了那些dispose;如此更令人感觉直接在Controller类上面表明数据库链接方便的很,但试为何微软mvc模板Controller中会再自带四个dispose方法吗,那二种情况存在不清除的说教,当然今日的显要目标不是为着求证那二种到底哪些是对的,此文章一时半刻以自动生成的dispose为合理说法来享受内容(注:朋友们请勿抠字眼);

 

手拉手来看,假诺自动模板生成的一切靠Controller重写的这么些dispose来刑释数据连接,那么在多工作逻辑下,比如本身在登陆的时候我们除了匹配唯一用户外,还供给记录获取权力树,参加redis的session储存在这之中等操作,不恐怕等那些操作完了再来释放数据连接,那样登陆用户多了一定会反常呢,假如是那种情况的标题,只怕只好通过在某处操作数据库后即时释放连接了;以上是格式观点和理念,也许有不妥之处,请联系指正,多谢,特别是using真的不供给呢这一个难题;

下边一步1个脚印的来享受:

 

. 精晓分布式的session(个人掌握)

. List集合生成权限树

首先,操作session格局,那里要说的是登录的session,了解是基于个人观点来的,并且那里的驾驭或者不是那么深入哈;经常我们建设的网站也许管理种类都有用户登陆,登陆后会有三个存款和储蓄用户基本消息的session保存在服务器,保存session的点子有多中,这里要享受的是采纳redis来囤积session;随着登陆用户扩充,存款和储蓄在服务器上的session也越来越多,借使某台服务器上应用内部存款和储蓄器保存的sesssion那服务器的内存占有会比较的升级,最后恐怕间接奔溃,严重的是因为长日子百分之百内部存款和储蓄器占用率恐怕导致硬盘烧坏,因而产生了多样储存格局如:使用同步session到分裂服务器格局做读写分离,数据仓库储存款和储蓄session等办法;其实大家要用到的redis集群存储操作session的法子也至关心注重若是分摊读写;

率先,笔者那里定义了2个稳定的实业:

附带,session的读写分离平常都对应站点有一点都不小的访问量了,假使访问量如此之大那么站点的揭橥对应的应当也是集群的主意(名为分布式架构),分布式架构和单站点方式相比较最分明的在于分布式对应的八个站点只要求利用个中某1个登陆入口登陆后,其余站点共享此session,无需再做登陆操作,其实那里就足以当做是单点登陆,只是分布式集群一般访问的都以同1个域名或同一ip段而已;而单站点情势平时就是自家那边登陆了,就不得不本人本系统能使用,其它的体系不能够采纳(常规来讲);

882828九五至尊手机版 2882828九五至尊手机版 3

末段,既然要满足共享session,那么session要么正是保存在同2个地点,读取的时候也在同二个地点读取;要么就redis集群那种方法贯彻即时同步到分裂服务器上或不相同端口完结数量读写分离;那样就能确认保证统一数据源;

 /// <summary>
        /// 菜单类
        /// </summary>
        public class MoMenu
        {

            /// <summary>
            /// 菜单Id (必填)
            /// </summary>
            public int Id { get; set; }

            /// <summary>
            /// 名称
            /// </summary>
            public string Name { get; set; }

            /// <summary>
            /// 链接地址 (建议填写,每个需要登录访问的Action需要使用这个对比是否有权限)
            /// </summary>
            public string Link { get; set; }

            /// <summary>
            /// 描述
            /// </summary>
            public string Des { get; set; }

            /// <summary>
            /// 图标样式,对应StageClass.MoIcon
            /// </summary>
            public string Icon { get; set; }

            /// <summary>
            /// 排序(升序)
            /// </summary>
            public int Sort { get; set; }

            /// <summary>
            /// 父级菜单Id,最顶层父级默认0
            /// </summary>
            public int ParentId { get; set; }

            /// <summary>
            /// 是否导航栏
            /// </summary>
            public bool IsMenu { get; set; }

            /// <summary>
            /// 菜单子级集合
            /// </summary>
            public List<MoMenu> ListMenu { get; set; }
        }

 

View Code

. 分析分布式session的流离失所进度

主要用于装系统中具有菜单的数额,并且区分层级关系,然后通过如下方法:

先是,上边的始末也基本介绍了下分布式session(session数据源统一),那里要说的是分布式登录时几个问号:

 1 /// <summary>
 2         /// List集合生成菜单树
 3         /// </summary>
 4         /// <typeparam name="T">对比选中菜单的对象</typeparam>
 5         /// <param name="html"></param>
 6         /// <param name="list">系统全部菜单(需要有层级关系)</param>
 7         /// <param name="name">生成的checkboxlist的name</param>
 8         /// <param name="checkList">选中菜单的集合</param>
 9         /// <param name="defValFiled">选中匹配的默认值</param>
10         /// <param name="isEnable">是否启用(查看状态不需要启用)</param>
11         /// <param name="nLoop">循环层次(可能多余的吧)</param>
12         /// <returns></returns>
13         public static MvcHtmlString CheckBoxMenuByList<T>(
14             this HtmlHelper html,
15             List<StageModel.MoMenu> list,
16             string name = "RadStatus",
17             IEnumerable<T> checkList = null,
18             string defValFiled = "Id",
19 
20             bool isEnable = true,
21             int nLoop = 0)
22             where T : class ,new()
23         {
24             var sbHtml = new StringBuilder(string.Empty);
25             sbHtml.AppendFormat("<ul class='divmenu' style=\"list-style:none;{0}\">", nLoop <= 0 ? "display:block" : "display:none");
26             foreach (var item in list)
27             {
28                 var isCheck = false;
29                 if (checkList != null)
30                 {
31                     foreach (var checkItem in checkList)
32                     {
33                         var ty = checkItem.GetType();
34                         var val = ty.GetProperty(defValFiled).GetValue(checkItem, null);
35                         isCheck = val.ToString().Equals(item.Id.ToString());
36                         if (isCheck) { break; }
37                     }
38                 }
39 
40                 sbHtml.Append("<li>");
41                 sbHtml.AppendFormat("<input id=\"{0}{1}\" name=\"{0}\" type=\"checkbox\" value=\"{1}\" {3} {4}/><label>{2}<b>{5}</b></label>",   // class=\"arrow fa fa-angle-down\"
42                     name,
43                     item.Id,
44                     item.Name,
45                     isCheck ? "checked=\"checked\"" : "",
46                     isEnable ? "" : "disabled=\"disabled\"",
47 
48                     item.ListMenu == null ? "" : (item.ListMenu.Count > 0 ? string.Format("[{0}]", item.ListMenu.Count) : "")
49                     );
50                 if (item.ListMenu == null) { sbHtml.Append("</li>"); continue; }
51                 if (item.ListMenu.Count > 0)
52                 {
53                     sbHtml.Append(CheckBoxMenuByList(html, item.ListMenu, name, checkList, defValFiled, isEnable, isCheck ? 0 : nLoop++));
54                 }
55                 sbHtml.Append("</li>");
56             }
57             sbHtml.Append("</ul>");
58             return MvcHtmlString.Create(sbHtml.ToString());
59         }

. 系统怎么发生共享session

遍历生成菜单树,作用有:1.在查看情状即可使其禁用选用,2.编写制定状态卓越对象选中菜单;然后需求在准备中扩张如js代码:

. 用户依照何种数据获得一致的session

1 $("ul[class='divmenu'] li input[type='checkbox']").on("click", function () {
2 
3             var isCheck = $(this).is(":checked");
4             //子级
5             $(this).nextAll("ul").find("li input[type='checkbox']").prop("checked", isCheck);
6         });
7         $("ul[class='divmenu'] li label").on("click", function () {
8             $(this).next("ul[class='divmenu']").toggle("normal");
9         });

. 共享session生存的周期

终极,只要求在必要使用该菜单树的地方添加代码如: @Html.Check博克斯MenuByList(Stage.Com.Extend.StageClass.GetAllMenus(),
“MenuIds”, Model.MoRoleAndMenus, “MenuId”) 即可,看到的效益图:

上边来交给对应上边难点的作答及证明:

882828九五至尊手机版 4

.
发生session其实正是保存session数据,在用户选用分布式站点率先次登陆时,从数据库检查此账号运转登陆,在回去登录成功消息给用户前,会先生成3个分布式系统中绝无仅有的一个key,这些key平常采用的条条框框是分布式站点Id(各个分布式子站点对应的Id)+时间戳+用户登陆唯一的账号+加密串+Guid组合而成(或者有其它不一致的承接保险唯一key的法子吗),然后用md5或hash等加密,再把用户的根底音信和key一起保存到钦赐的Redis服务(姑且用redis存session,日常是键值对的关联)中,并且会回来key到用户的cookie中

切实大家能够登陆ShenNiu.MVC试试效果

.
用户要去的应和的session,就是经过cookie存款和储蓄的key传递给每台分布式的站点,站点获取cookie再去指定的session读取的地点得到是还是不是有对应的key并收获session保存的多寡;只要用户有实用的cookie就能登录分布式系统;若是本人用ie浏览器登陆系统后,再选用google浏览器访问系统,那样使用google浏览器时候登陆不成事的,因为cookie没有跨域,可是一旦你手动还是经过别的人为方式利用ie登陆成功后再次来到的cookie的key参加到google中,那么相同登陆也是没难点的,可以试行按照常理分析是没难题的

 

.
session的生命周期大家应该都很尊崇,日常1个session不容许设置成有线久的生命周期,那个时候就须求依据每一遍用户触发验证登陆的时候,自动从新安装session失效时间(一般就当前光阴以往推你session定义的逾期时间);由于分布式用到了cookie所以此时还索要再行更新设置下cookie的key过期时间,这样使用cookie+seesion来保存用户的登陆有效性,直到用户超越了session有效期还并未接触过登陆验证或许特殊措施清除了cookie,那这几个时候过期的cookie或session就会评释用户须求登录才能访问要求权限的页面

. 相比集合,加载checkboxlist

 

第三,直接贴代码如:

. 封装session登录验证和剥离的集体艺术

 1 /// <summary>
 2         /// 对比集合,加载checkboxlist
 3         /// </summary>
 4         /// <typeparam name="T">目标对象</typeparam>
 5         /// <param name="html"></param>
 6         /// <param name="orgList">目标集合</param>
 7         /// <param name="orgFiledVal">目标对应checkbox的value值的属性名称</param>
 8         /// <param name="orgFiledText">对应的checkbox文本的text值的属性名称</param>
 9         /// <param name="destList">匹配集合</param>
10         /// <param name="destFiled">匹配列的属性名称</param>
11         /// <param name="sClass">样式</param>
12         /// <param name="name">checkboxlist的Name</param>
13         /// <returns></returns>
14         public static MvcHtmlString CheckBoxRoleByList<T, TT>(
15             this HtmlHelper html,
16             IEnumerable<T> orgList,
17             string orgFiledVal,
18             string orgFiledText,
19 
20             IEnumerable<TT> destList = null,
21             string destFiled = "",
22 
23             string sClass = "",
24             string name = "cbAll")
25             where T : class ,new()
26             where TT : class,new()
27         {
28             var sbHtml = new StringBuilder(string.Empty);
29             if (orgList.Count() <= 0) { return MvcHtmlString.Create(string.Empty); }
30 
31             sbHtml.AppendFormat("<div class=\"{0}\">", sClass);
32             foreach (var item in orgList)
33             {
34                 var ty = item.GetType();
35                 var val = ty.GetProperty(orgFiledVal).GetValue(item, null);
36                 var text = ty.GetProperty(orgFiledText).GetValue(item, null);
37 
38                 var isMatch = false;
39                 if (destList != null)
40                 {
41                     foreach (var destItem in destList)
42                     {
43                         var destty = destItem.GetType();
44                         var destval = destty.GetProperty(destFiled).GetValue(destItem, null);
45 
46                         if (val.ToString().ToUpper().Equals(destval.ToString().ToUpper()))
47                         {
48                             isMatch = true;
49                             break;
50                         }
51                     }
52                 }
53                 sbHtml.AppendFormat("<label><input type='checkbox' name='{0}' value='{1}' {3} />{2}</label>", name, val, text, isMatch ? "checked='checked'" : "");
54             }
55             sbHtml.Append("</div>");
56             return MvcHtmlString.Create(sbHtml.ToString());
57         }

先是,将要发出去的七个C#方法都进过测试了,我们能够一向拿来选择,当然此格局用到了眼下分享的CacheRepository缓存工厂,因为自身保留session是在redis中,上边先来贴出方法内容:

选拔编辑页面包车型客车功力图如:

 1  /// <summary>
 2     /// Login扩展类
 3     /// </summary>
 4     public class UserLoginExtend
 5     {
 6 
 7         public static string HashSessionKey = "Hash_SessionIds";
 8         public static string CookieName = "Sid";
 9 
10         public static T BaseSession<T>(HttpContextBase context) where T : class,new()
11         {
12             //获取cookie中的token
13             var cookie = context.Request.Cookies.Get(CookieName);
14             if (cookie == null) { return default(T); }
15 
16             //使用toke去查询缓存工厂是否有对应的session信息,如果有自动把缓存工厂的时间往后延nAddCookieExpires分钟
17             //return CacheRepository.Current(CacheType.RedisCache).GetHashValue<T>(HashSessionKey, cookie.Value);
18             return CacheRepository.Current(CacheType.RedisCache).GetCache<T>(cookie.Value);
19         }
20 
21         public static RedirectResult BaseCheckLogin<T>(
22             HttpContextBase context,
23             out T t,
24             int nAddCookieExpires = 30,
25             string loginUrl = "/User/Login") where T : class,new()
26         {
27             var returnUrl = context.Request.Path;
28             var result = new RedirectResult(string.Format("{0}?returnUrl={1}", loginUrl, returnUrl));
29             t = default(T);
30             try
31             {
32 
33                 //获取cookie中的token
34                 var cookie = context.Request.Cookies.Get(CookieName);
35                 if (cookie == null) { return result; }
36 
37                 //使用toke去查询缓存工厂是否有对应的session信息,如果有自动把缓存工厂的时间往后延nAddCookieExpires分钟
38                 //t = CacheRepository.Current(CacheType.RedisCache).GetHashValue<T>(HashSessionKey, cookie.Value);
39                 t = CacheRepository.Current(CacheType.RedisCache).GetCache<T>(cookie.Value, true);
40                 if (t == null)
41                 {
42                     //清空cookie
43                     cookie.Expires = DateTime.Now.AddDays(-1);
44                     context.Response.SetCookie(cookie);
45                     return result;
46                 }
47 
48                 //登陆验证都成功后,需要重新设置cookie中的toke失效时间
49                 cookie.Expires = DateTime.Now.AddMinutes(nAddCookieExpires);
50                 context.Response.SetCookie(cookie);
51 
52                 //设置session失效时间
53                 CacheRepository.Current(CacheType.RedisCache).AddExpire(cookie.Value, nAddCookieExpires);
54             }
55             catch (Exception ex)
56             {
57                 return result;
58             }
59             return null;
60         }
61 
62         public static RedirectResult BaseLoginOut(HttpContextBase context, string redirectUrl = "/")
63         {
64             var result = new RedirectResult(string.IsNullOrEmpty(redirectUrl) ? "/" : redirectUrl);
65             try
66             {
67                 //获取cookie中的token
68                 var cookie = context.Request.Cookies.Get(CookieName);
69                 if (cookie == null) { return result; }
70 
71                 var key = cookie.Value;
72 
73                 //设置过期cookie(先过期cookie)
74                 cookie.Expires = DateTime.Now.AddDays(-1);
75                 context.Response.SetCookie(cookie);
76 
77                 //移除session
78                 //var isRemove = CacheRepository.Current(CacheType.RedisCache).RemoveHashByKey(HashSessionKey, key);
79                 var isRemove = CacheRepository.Current(CacheType.RedisCache).Remove(key);
80             }
81             catch (Exception ex)
82             {
83 
84                 throw new Exception(ex.Message);
85             }
86             //跳转到指定地址
87             return result;
88         }
89     }

882828九五至尊手机版 5

BaseCheckLogin方法首要用来表明是或不是登录,没有登录跳转到重定向地址中;如若证实是登录状态,会自动重新安装redis存款和储蓄的session有效期,玉石俱焚新安装cookie有效期;看代码的话实际就那一点首要的地点都有备注表达;

来看效率是暗许绑定了该用户对应的权限“高级用户”,代码要求珍视是:

BaseLoginOut方法首要用来清空用户注销后的session数据和cookie数据;那多少个主意都以熟视无睹登陆验证需求的剧情,两情势重回的是RedirectResult,适用于.net的mvc版本;

1  var ty = item.GetType();
2  var val = ty.GetProperty(orgFiledVal).GetValue(item, null);
3  var text = ty.GetProperty(orgFiledText).GetValue(item, null);

 

第二职能便是钦点特定的性质,获取特定属性的value值;item是List集合中的某部对象,具体参数表达能够看下代码备注;

. Redis存款和储蓄分布式session的登录实例(那里是.net mvc代码操作)

 

先是,看下登陆的action代码:

. 为什么使用redis来保存session

882828九五至尊手机版 6882828九五至尊手机版 7

本条小标题不好定义,小编个人的看法,大家能够看看罢了;1:redis存款和储蓄数据足以设置失效时间,那就类似于session失效的功效等同,所以redis能很好的来作为session容器;2:用地方一点大家能够再充实nginx等分布式服务,以此来打架多个分布式架构,那样在更新子系统的时候不会促成所以的业务瘫痪,能够不对用户的操作造成阻碍,就像没有更细过相同;3:基于redis搭建session服务器后session服务器这些时候能够独自分到此外一台服务器上,这样减少了内部存款和储蓄器占有率,应用程序和session分布两个服务器,大大进步承载率,不至于说什么样千万级别就把你系统cpu爆满了,session还各个丢失的情景;4.采用redis打架服务后得以应用多余空间存款和储蓄一些十分的短变动的数额和消息,列如:系统中的菜单栏,一些音信提醒,邮件发送等数码,都得以运用其保存;

 1 [HttpPost]
 2         //[ValidateAntiForgeryToken]
 3         public ActionResult Login([Bind(Include = "UserName,UserPwd", Exclude = "Email")]MoUserInfo model, string returnUrl)
 4         {
 5 
 6             if (ModelState.IsValid)
 7             {
 8                 //初始化数据库读取数据  nginx+iis+redis+Task.MainForm组建分布式架构 - (nginx+iis构建服务集群)
 9                 model.Email = "841202396@qq.com";
10                 model.Id = 1;
11                 model.Introduce = "专注web开发二十年";
12                 model.Sex = false;
13                 model.Tel = "183012787xx";
14                 model.Photo = "/Content/ace-master/assetsvatars/profile-pic.jpg";
15 
16                 model.NickName = "神牛步行3";
17                 model.Addr = "北京-亦庄";
18                 model.Birthday = "1991-05-31";
19                 model.Blog = "http://www.cnblogs.com/wangrudong003/";
20 
21                 var role = new StageModel.MoRole();
22                 role.Name = "系统管理员";
23                 role.Des = "管理整个系统";
24 
25                 //根据角色Id获取对应菜单Id,这里构造成List<int>形式
26                 var menus = new List<StageModel.MoMenu>{
27                   new  StageModel.MoMenu{
28                       Id = 1001,
29                       Link="/User/UserCenter"
30                   },
31                    new  StageModel.MoMenu{
32                       Id = 1002,
33                       Link="/User/ChangeUser1"
34                   },
35                   new  StageModel.MoMenu{
36                       Id = 1003,
37                       Link=""
38                   },
39 
40                    new  StageModel.MoMenu{
41                       Id = 2001001,
42                       Link=""
43                   },
44                    new  StageModel.MoMenu{
45                       Id = 2001002,
46                       Link=""
47                   }
48                 };
49 
50                 //赋值个人信息
51                 var userData = new StageModel.MoUserData();
52                 userData.Email = model.Email;
53                 userData.Id = model.Id;
54                 userData.Introduce = model.Introduce;
55                 userData.Sex = model.Sex;
56                 userData.Tel = model.Tel;
57                 userData.Photo = model.Photo;
58 
59                 userData.UserName = model.UserName;
60                 userData.NickName = model.NickName;
61                 userData.Addr = model.Addr;
62                 userData.Birthday = model.Birthday;
63                 userData.Blog = model.Blog;
64 
65                 //能访问菜单的Ids  
66                 userData.Menus = menus;
67 
68                 //获取唯一token
69                 var token = CacheRepository.Current(CacheType.BaseCache).GetSessionId(userData.UserName);
70                 var timeOut = 2; //分钟
71                 //if (CacheRepository.Current(CacheType.RedisCache).SetHashCache<StageModel.MoUserData>("Hash_SessionIds", token, userData,2))
72                 if (CacheRepository.Current(CacheType.RedisCache).SetCache<StageModel.MoUserData>(token, userData, 2, true))
73                 {
74                     var cookie = new HttpCookie(UserLoginExtend.CookieName, token);
75                     cookie.Expires = DateTime.Now.AddMinutes(timeOut);
76                     HttpContext.Response.AppendCookie(cookie);
77 
78                     return new RedirectResult(returnUrl);
79                 }
80             }
81 
82             return View(model);
83         }

上述是个体的视角和计算,希望能对我们有协助;由于自家经验有限,如有不创造的地点请多多指正,多谢。

View Code

中间用到了 var token =
CacheRepository.Current(CacheType.BaseCache).GetSessionId(userData.UserName)
 方法,那个艺术首假使用来获得下面说的分布式唯一的key,参数只供给传递用户登陆的唯一账号就行了(底层用的是Md5hash值算法,文字结尾给出所以代码);获取key后选取 CacheRepository.Current(CacheType.RedisCache).SetCache<StageModel.MoUserData>(token,
userData, 2, true) 方法来设置登陆的基本音信到redis服务中,倘若保存redis数据成功再通过 HttpContext.Response.AppendCookie(cookie); 吧key输出到用户的cookie中保留;

然后,登陆后一般会跳转到用户后台,用户后台的片段页面须要登录验证,笔者那边是选用后台多少个Controller来继承同贰个父级BaseController,父级里面重写Initialize方法来表达登陆消息;代码如下:

 1 public class BaseController : Controller
 2     {
 3 
 4         protected StageModel.MoUserData userData;
 5 
 6         protected override void Initialize(System.Web.Routing.RequestContext requestContext)
 7         {
 8 
 9             //使用登录扩展,验证登陆,获取登陆信息
10             var redirectResult = UserLoginExtend.BaseCheckLogin(requestContext.HttpContext, out userData,2);
11             //验证失败,跳转到loginUrl
12             if (redirectResult != null)
13             {
14                 requestContext.HttpContext.Response.Redirect(redirectResult.Url, true);
15                 return;
16             }
17 
18             //验证成功,添加视图访问登陆信息数据
19             ViewBag.UserData = userData;
20             base.Initialize(requestContext);
21         }
22     }

BaseCheckLogin方法就是我们地点分享的公家验证登陆的措施,具体参数能够看下参数描述表达;代码写好后,来看下运营的页面效果(笔者那边运用的是前一章我们的nginx集群来演示):

882828九五至尊手机版 8

海螺红框里面包车型地铁就是咋们自个儿生育的Sid也正是地点说的key,接着咋们在打开3个浏览器tab,来看下系统02的Sid,如图:

882828九五至尊手机版 9

透过上图能够看来系统01和类别02,对应的sid都是均等的值,每回这样分布式站点的session使用和创设就打响了,好那咋们通过redis-cli.exe客户端看下大家登陆后保存在redis服务中的数据图如:

882828九五至尊手机版 10

总的来看的redis里的key和我们浏览器截图中的key是平等的,所以本章要将的情节大体就要甘休了,如果觉得小说让您拥有收获,请多多点”“,谢谢。

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图