摘要

在asp.net web中,session经常用来存储当前用户信息,或者通过session进行登录权限的验证。如果是一台服务器,session的使用没问题,如果使用nginx等实现反向代理,将站点部署在多台服务器的情况下,有可能出现这样的现象:你登录的时候是在服务器A登录,并且采用的session存储是进程内存储的方式,你在访问其他页面的情况下,nginx有可能将你的请求转发到服务器B,但服务器B进程内并没有保存你的用户信息,在校验权限的时候,会将你重定向到登录页面。

解决方案

首先需要了解asp.net的session几种存储方式,可以在web.config中进行设置。如图所示:

InProc

服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这种模式最大的好处就是性能提高。但也有缺点,伴随着iis重启或应用重启,session将会丢失。

StateServer

此种方式独立于IIS进程,使用此种方式需要在服务器上开启ASP.NET State Service服务。

Off

表示不使用Session功能。

SQLServer

表示将Session存储在SQL Server。

Custom

自定义存储。

在使用Redis存储的时候可以使用nuget中的一个组件。如图所示:

安装成功之后,需要在web.config中生成配置项,根据实际项目进行配置。如图所示:

设置host(redis服务器ip),databaseId(数据库索引),accessKey(账户pwd)信息。

一个例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Wolfy.RedisSession.Models;namespace Wolfy.RedisSession.Controllers
{public class HomeController : Controller{// GET: Homepublic ActionResult Login(){return View();}[HttpPost]public JsonResult Login(UserViewModel user){if (!ModelState.IsValid){return new JsonResult { Data = new { _code = 400, _msg = "Login err" }, JsonRequestBehavior = JsonRequestBehavior.DenyGet };}if (user.Name == "wolfy" && user.Pwd == "12345"){Session["user"] = user;return new JsonResult { Data = new { _code = 200, _msg = "Login Success" }, JsonRequestBehavior = JsonRequestBehavior.DenyGet };}else{return new JsonResult { Data = new { _code = 400, _msg = "Login err" }, JsonRequestBehavior = JsonRequestBehavior.DenyGet };}}public ActionResult List(){UserViewModel user = Session["user"] as UserViewModel;if (user == null){return new HttpUnauthorizedResult();}return View();}}
}

@model Wolfy.RedisSession.Models.UserViewModel@{Layout = null;
}<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width" /><title>Login</title>
</head>
<body>@using (Html.BeginForm()) {@Html.AntiForgeryToken()<div class="form-horizontal"><h4>UserViewModel</h4><hr />@Html.ValidationSummary(true, "", new { @class = "text-danger" })<div class="form-group">@Html.LabelFor(model => model.Name, htmlAttributes: new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.EditorFor(model => model.Name, new { htmlAttributes = new { @class = "form-control" } })@Html.ValidationMessageFor(model => model.Name, "", new { @class = "text-danger" })</div></div><div class="form-group">@Html.LabelFor(model => model.Pwd, htmlAttributes: new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.EditorFor(model => model.Pwd, new { htmlAttributes = new { @class = "form-control" } })@Html.ValidationMessageFor(model => model.Pwd, "", new { @class = "text-danger" })</div></div><div class="form-group"><div class="col-md-offset-2 col-md-10"><input type="submit" value="Login" class="btn btn-default" /></div></div></div>}<div>@Html.ActionLink("Back to List", "Index")</div>
</body>
</html>

上面的代码片段很简单,登录成功后将用户信息保存在session["user"]中,在访问List视图的时候,需要进行是否登录的验证。如果session为空,则返回未授权,否则向用户展示list视图。

如果在没登录直接访问list,如图所示:

登录

刷新list页面,就可以正常访问了。

看一下redis中保存的内容

我们都知道,在没禁用cookie的情况下,session_id是存储在cookie中的,那么我们看一下请求中的sessionid跟redis的key是否有关系?

看来Redis中用来保存session的键是根据Session_id来生成的。感兴趣的可以研究一下这个开源项目:

https://github.com/Azure/aspnet-redis-providers

转载于:https://www.cnblogs.com/wolf-sun/p/6549209.html

分布式中使用redis进行session共享相关推荐

  1. 分布式中使用 Redis 实现 Session 共享(中)

    http://blog.jobbole.com/91874/ 原文出处: 焰尾迭   欢迎分享原创到伯乐头条 上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最 ...

  2. 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

    因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...

  3. SpringBoot整合Redis+Redis缓存应用+Redis实现Session共享+...

    一.SpringBoot整合Redis 1.导入依赖 <!--存在Redis依赖--> <dependency><groupId>org.springframewo ...

  4. Tomcat通过Redis实现session共享的完整部署记录

    对于生产环境有了一定规模的tomcat集群业务来说,要实现session会话共享,比较稳妥的方式就是使用数据库持久化session.为什么要持久化session(共享session)呢?因为在客户端每 ...

  5. Rainbond最佳实践:Tomcat配置Redis实现Session共享

    Rainbond:生产级无服务器PaaS Rainbond是国内首个开源的生产级无服务器PaaS,深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术 ...

  6. redis实现session共享,哨兵

    一.Redis介绍 1.redis是key-value的存储系统,属于非关系型数据库 2.特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会 ...

  7. 单点登录实现(spring session+redis完成session共享)

    一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...

  8. php 获取cookieid,Redis实现Session共享详解

    Redis实现Session共享 这几天在做session共享这么一个小模块,也查了好多资料,给我的感觉,就是太乱了,一直找不到我想要的东西,几乎全部实现方法都与我的想法不一样,在这里,我总结一下自己 ...

  9. C#session共享+redis_技术干货分享:基于SpringBoot+Redis的Session共享与单点登录

    categories: 架构 author: mrzhou tags: SpringBoot redis session 单点登录 基于SpringBoot+Redis的Session共享与单点登录 ...

  10. Tomcat集群通过redis实现session共享

    Tomcat集群通过redis实现session共享 最近在XXX项目上做了tomcat集群的session共享,闲来无事鄙人将整个踩坑的过程粗糙的记录下来,给同学们分享一波,整个过程无硬编码,爽歪歪 ...

最新文章

  1. singleton设计模式_让我们研究一下Singleton设计模式的优缺点
  2. ​MEMS在未来面临的挑战
  3. linux下sudo命令[转]
  4. 操作系统之CPU调度
  5. FATAL: NO bootable medium found! System halted
  6. Leet Code OJ 326. Power of Three [Difficulty: Easy]
  7. 默认HotSpot最大直接内存大小
  8. Java的加载与执行
  9. 日语学习-多邻国-关卡1-学校
  10. CF666B. World Tour
  11. 3西格玛计算公式_西格玛和西格玛水平
  12. JAVA事务配置总结
  13. excel制作随着日期的改变而变化的动态日历
  14. 《三联生活周刊》2017年第26期:3星。终南山隐士现状。
  15. 【2020-CVPR-3D人体姿态估计】MetaFuse :A Pre-trained Fusion Model for Human Pose Estimation
  16. 安卓app开发方案_简谈企业最常用的三种安卓app开发语言
  17. verilog简单奇校验
  18. 债券基础知识和可转债剖析
  19. 【新手教程】51Sim-One Cloud 2.0如何构建一个V2X案例
  20. 强大的多语言版本在线图片处理网站

热门文章

  1. InnoDB脏页,重做日志文件
  2. ubuntu php命令行模式,在命令行ubuntu 16.04上切换php版本
  3. SimpleFs文件系统初步二(测试用的块设备构建)
  4. linux内存源码分析 - 内存池
  5. Linux内核部件分析 设备驱动模型之device
  6. Linux虚拟文件系统之文件打开(sys_open())
  7. Voltage Keepsake CodeForces - 801C(二分)
  8. python import py文件权限_python 常见问题:导入py文件易忽略问题
  9. spark压缩和序列化相关
  10. Python模块受欢迎排行榜Top200