正常系统中一般我们用session来保存用户的登录信息。当用户进行相关的需要登录权限访问的资源时会从session中取出用户信息。如果取不到了代表session过期用户登录超时了。然后进行跳出至登录界面。
我们这次的需求是当用户登陆后在一个界面不进行任何操作一定时间需要自动弹出至登录界面。那么我们就需要用轮询来进行格一段时间访问用户是否超时,此时session的话就不合适了,会导致session存活时间一直被刷新永不过期。
所以我们采用cookie的方式来存放用户活动信息。当用户进行访问相关的资源页时进行状态刷新,以下是配合用户是否已登录的校验方法写在一起。
public void checkLogin(HttpContext context) { if (context.Session["UserInfo"] == null) { string sUserId = LIB.Utils.GetCookie("systemUserId"); int uid = 0; int.TryParse(sUserId, out uid); if (uid > 0) { userInfo = GetUserInfo(uid); context.Session["UserInfo"] = userInfo; } else { context.Response.Redirect("~/Login.aspx"); } //Response.Write("<script>window.parent.location.href='/Login.aspx';</script>"); } if (context.Session["UserInfo"] != null) { userInfo = (UserInfo)context.Session["UserInfo"]; if (userInfo.unionEntity != null) { CurrentUnionId = userInfo.unionEntity.GUID; CurrentUnionName = userInfo.unionEntity.UnionName; CurrentParentUnionId = userInfo.unionEntity.ParentGuid == null ? 0 : Convert.ToInt32(userInfo.unionEntity.ParentGuid); CurrentParentUnionName = userInfo.unionEntity.ParentUnionName; } if (userInfo.deptUnionEntity != null) { CurrentRoleId = userInfo.RoleGUID; CurrentRoleName = userInfo.RoleName; } LIB.Utils.WriteCookie("activeTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),60*24);//刷新存储用户活跃时间 LIB.Utils.WriteCookie("systemUserId",userInfo.GUID.ToString(),30);//刷新用户信息30分钟未活动过期 } }
轮询判断方法:
private string getActiveTime() { var flag = "true"; if (session["UserInfo"] != null) { DateTime dt = DateTime.Now; DateTime activetime; var s = LIB.Utils.GetCookie("activeTime"); DateTime.TryParse(s, out activetime); var minutes = dt.Subtract(activetime).Minutes; if (minutes > 25) { flag = "false";//活动时间超过25分钟未活动自动登出 session.RemoveAll(); LIB.Utils.WriteCookie("systemUserId", "-1"); } }else{ flag="false"; } return flag; }
大体方法为用cookie存储活动时间,轮询的时候进行取cookie与当前时间对比多少分钟了,超过时间后 进行清空session以及将cookie身份cookie置为无效值。下次校验时进行退出。 此处设置的超时时间并没有特别精确会产生1-2分钟的误差,主要跟轮询间隔时间有关。后台管理中心页面都继承了一个母页面 轮询是放在了母页面中的。