热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ASP.NETMVC单点登录(多站点共享用户信息)

一、多站点共享用户信息解决方案:采用分布式缓存Memcache模拟Session进行用户信息信息共享1、视图部分@{Layoutnull;}XX商城后

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

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

1、视图部分

技术分享

@{
    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>

登录页面展示:

技术分享

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();
        }

    }
}

三、源码下载:

点击下载源码>>

点击下载数据库文件>>

ASP.NET MVC单点登录(多站点共享用户信息)


推荐阅读
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 运算放大器使用规则及注意事项
    本文介绍了运算放大器的使用规则和注意事项,包括输入电压的限制、输出直接并接电容的安全性等。通过了解这些规则和注意事项,可以更好地使用运算放大器,避免出现意外情况。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
author-avatar
月光女孩2602906135_166
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有