在登陆的时候,判断密码账号是否正确,正确的话分配一个Guid(全局标识符)给当前用户,并在全局变量中存储当前用户的Id和他的Guid。代码如下:
//保存登陆成功的令牌
string Guid_str = "";
//分配一个唯一标识符
Guid_str = Guid.NewGuid().ToString();
Response.Cookies["GUID"].Value = Guid_str;
//给系统变量存储一个值,Uid代表哪个用户,GUID则是唯一标识符
Application[user.Id + "_GUID"] = Guid_str;
Session["Uid"] = user.Id;
然后创建一个一般处理程序。
注意:如果要用session的话需要继承接口,并且引入SessionState命名空间,否则Session为null;
using System;
using System.Web;
using System.Runtime.Serialization.Json;
using BLL;
using Model;
//注意:如果要用session的话需要继承接口,并且引入SessionState命名空间
using System.Web.SessionState;
public class RepeatLogin : IHttpHandler,IRequiresSessionState{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//全局变量
HttpApplicationState applicationState = HttpContext.Current.Application;
string message = "";
string Uid = "";
//判断Session是否还有效
if (context.Session["Uid"] == null)
{
message = "Disabled";
}
else
{
//获取session里面的用户id
Uid = context.Session["Uid"].ToString();
//判断是否过期
if (context.Request.Cookies["GUID"] != null && applicationState[Uid + "_GUID"] != null)
{
//判断用户是否重复登陆
if (applicationState[Uid + "_GUID"].ToString() != context.Request.Cookies["GUID"].Value)
{
message = "Logined";
}
}
//判断用户的状态(根据自己项目实际情况)
if (new UserManager().GetUsers_ByUid(context.Session["Uid"].ToString()).States == 1)
{
message = "Freezed";
}
}
//返回
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(string));
ds.WriteObject(context.Response.OutputStream, message);
}
public bool IsReusable {
get {
return false;
}
}
}
创建一个js函数(可以单独创建个页面,然后在需要验证的页面用iframe调用即可),LogOut页面负责处理Session失效和跳转到登录页面
//禁止重复登陆
function RepeatLogin() {
$.getJSON("../Handlers/RepeatLogin.ashx", function (data) {
if (data == "Logined") {
alert('此用户已在别处登陆!你被强制下线!');
window.location.href = '../LogOut.aspx';
}
if (data == "Freezed") {
alert('你的账号刚刚被冻结!');
window.location.href = '../LogOut.aspx';
}
if (data == "Disabled") {
alert('身份信息以失效,请重新登陆!');
window.location.href = '../LogOut.aspx';
}
})
}
然后再你需要判断的页面进行js操作
$(function(){
//马上开始执行
RepeatLogin();
//每隔一秒执行一次
setInterval(RepeatLogin,1000);
})
当用户没有重复登陆时,系统分配一个guid给用户,并记录用户id和对应的guid,这个用户在线时系统变量存储的用户id以及对应的guid值是不会变的,这时候有另外一个人用相同的账号登陆时,会改变系统变量中用户id对应的guid,这时候一般处理程序就判断出系统变量存储的guid与用户cookie存储的guid不同时,就会强制用户下线。