登录流程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MyProject.IBLL;
using MyProject.BLL;
using MyProject.Common;
using System.Drawing;
using System.IO; namespace MyProject.Controllers
{
public class LoginController : Controller
{
//
// GET: /Login/
IUserInfoService userInfoService = new UserInfoService();
//展示登录页面
public ActionResult Index()
{
if (CheckCookieInfo()) {
return Redirect("/UserInfo/Index");
}
return View();
} private bool CheckCookieInfo()
{
bool flag = false;
if (Request.Cookies["cp1"] != null && Request.Cookies["cp2"] != null)
{
//获取浏览器传递过来的Cookie值
string username = Request.Cookies["cp1"].Value;
string psd = Request.Cookies["cp2"].Value;
string msg;
if (userInfoService.CheckUser(username, psd, out msg))
{
//设置登录标识
Session["username"] = username;
flag = true;
}
else
{
//验证失败清空无效Cookie
Response.Cookies["cp1"].Expires = DateTime.Now.AddDays(-);
Response.Cookies["cp2"].Expires = DateTime.Now.AddDays(-);
}
}
return flag;
}
//获取验证码
public ActionResult CreateCode() {
YZMHelper yzm = new YZMHelper();
Session["vCode"] = yzm.Text;
MemoryStream ms = new MemoryStream();
yzm.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.ToArray();
ms.Close();
return File(bytes, "Image/JPEG");
}
//检查用户名是否存在
public ActionResult ChechUserName(string username) {
if (userInfoService.LoadEntity(u => u.UserName == username).FirstOrDefault() != null)
{
return Json(new { res = }, JsonRequestBehavior.AllowGet);
}
else {
return Json(new { res = }, JsonRequestBehavior.AllowGet);
}
}
//登录校验
public ActionResult CkeckUser() {
string username = Request["UserName"];
string psd = Request["UserPwd"];
string vcode = Request["vCode"];
bool remmberFlag = Request["remmber"]==""?true:false;
if (vcode.Equals(Session["vCode"].ToString(), StringComparison.CurrentCultureIgnoreCase))
{
//清空保存验证码Session
Session["vCode"] = null;
string msg;
if (userInfoService.CheckUser(username, psd, out msg))
{
Session["username"] = username;
if (remmberFlag) {
//设置Cokkie信息
HttpCookie cookie1 = new HttpCookie("cp1", username);
//密码最好使用MD5加密
HttpCookie cookie2 = new HttpCookie("cp2", psd);
//设置过期时间
cookie1.Expires = DateTime.Now.AddDays();
cookie2.Expires = DateTime.Now.AddDays();
Response.Cookies.Add(cookie1);
Response.Cookies.Add(cookie2);
}
return Json(new { res = , msg = "/UserInfo/Index" });
}
else
{
//清空保存验证码Session,
Session["vCode"] = null;
return Json(new { res = , msg = msg });
}
}
else {
return Json(new { res = });
}
}
}
}

这种方法仅限于资源全储存于一台服务器上,如网站分布在多台服务器上,则需要单独将登录标识储存于数据库,然后给浏览器返回一个随机序列号作为SessionID,浏览器下次访问时会携带这个SessionId,然后从数据库(Memcache缓存)中查找,根据查找结果判断用户是否已经登录

这是实现服务器端分布式的必要的操作

               string sessionId =Guid.NewGuid().ToString();
          //作为Memcache的key
Common.MemcacheHelper.Set(sessionId,username( 登录标识,可以随意设置 ), DateTime.Now.AddMinutes());
          //使用Memcache代替Session解决数据在不同Web服务器之间共享的问题。
Response.Cookies["sessionId"].Value = sessionId;
          //将Memcache的key以cookie的形式返回到浏览器端的内存中,当用户再次请求其它的页面请求报文中会以Cookie将该值再次发送服务端。

接下来会介绍关于怎么用Memcache储存登录标识

ASP.net 完整登录流程的更多相关文章

  1. 本页面用来演示如何通过JS SDK,创建完整的QQ登录流程,并调用openapi接口

    QQ登录将用户信息存储在cookie中,命名为__qc__k ,请不要占用 __qc__k : 1) :: 在页面顶部引入JS SDK库: 将“js?”后面的appid参数(示例代码中的:100229 ...

  2. 利用Div+CSS(嵌套+盒模型)布局页面完整实例流程

    Div+CSS(嵌套+盒模型)布局页面完整实例流程: <!DOCTYPE html><html> <head>  <meta charset="UT ...

  3. ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程

    好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人>: --> 开篇:上一篇 ...

  4. ASP.Net MVC请求处理流程

    ASP.Net MVC请求处理流程 好听的歌 我一直觉得看一篇文章再听一首好听的歌,真是种享受.于是,我在这里嵌入一首好听的歌,当然你觉得不想听的话可以点击停止,歌曲 from 王菲 <梦中人& ...

  5. python全栈开发day60-django_app ORM 完整登录案例

    day60 内容回顾: 1. HTTP协议: 1.请求(浏览器发给服务端的消息——request) 请求方法 URL 协议版本\r\n k1:v1\r\n k2:v2\r\n \r\n 请求体 —— ...

  6. ASP.NET Forms 认证流程

    ASP.NET Forms 认证 Forms认证基础 HTTP是无状态的协议,也就是说用户的每次请求对服务器来说都是一次全新的请求,服务器不能识别这个请求是哪个用户发送的. 那服务器如何去判断一个用户 ...

  7. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  8. SCP免密传输和SSH登录流程详解

    SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu.树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的s ...

  9. MVC5+EF6 入门完整教程3 :EF完整开发流程

    https://www.cnblogs.com/miro/p/4053473.html 学完本篇文章,你将会掌握基于EF数据模型的完整开发流程. 本次将会完成EF数据模型的搭建和使用. 基于这个模型, ...

随机推荐

  1. Java自定义数据验证注解Annotation

    本文转载自:https://www.jianshu.com/p/616924cd07e6 Java注解Annotation用起来很方便,也越来越流行,由于其简单.简练且易于使用等特点,很多开发工具都提 ...

  2. 【Https】Spring RestTemplete支持Https安全请求

    实现步骤 Step1: 自定义ClientHttpRequestFactory package com.example.demo.https; import org.springframework.h ...

  3. python中画散点图

    python中画散点图 示例代码: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d impor ...

  4. 判断浏览器是否IE(IE11可用)

    function isIE() { //ie?         if (!!window.ActiveXObject || "ActiveXObject" in window) { ...

  5. docker私库harbor的搭建

    1.文件下载 # wget https://storage.googleapis.com/harbor-releases/harbor-online-installer-v1.5.1.tgz 安装官网 ...

  6. html地址--待更新

    11.学习笔记: 视频直播技术:ijkplayer技术:jni技术: https://www.cnblogs.com/renhui/category/1011048.html: IM:环信, xmpp ...

  7. Jmeter(一)简介以及环境搭建

    刚刚在打扫卫生的时候,就一直在思考近一年以来所学知识及体系.知识太过于碎片化,整理的东西全写在笔记本上,日常工作不可能全部用到,所以复习很重要.因此开始准备将一些知识写在随笔里边,用于知识体系的重建, ...

  8. phpmyadmin在nginx环境下配置错误

    location ~ \.css {           add_header  Content-Type    text/css;        } location ~ \.js {        ...

  9. npm 淘宝镜像

    npm config set registry https://registry.npm.taobao.org

  10. Java中关于大小写字母的转换

    方法一: 大小写字母在ascii码表中相减的值为32 故可将字符串转车字符数组 小写转大写减32 大写转小写加32 String s= "good"; char[] c = s.t ...