Cookies+Session保存用户登陆状态

Cookies+Session保存用户登陆状态的验证方式是纯的Session方式,虽然设置了超时时间,但是好像登陆状态经常会动不动就丢失,导致客户抱怨不断,今天仔细的考虑了一下,决定采用Cookies跟Session结合的方式来判断用户的登陆状态

代码如下:

1、用户登陆代码
HttpContext.Current.Session.Abandon(); //清空当前所有的Session
HttpCookie Cookies = new HttpCookie("AdminInfo");
Cookies.Expires = DateTime.Now.AddHours(-1); //设置过期时间,即强制删除先前的Cookie
HttpContext.Current.Response.AppendCookie(Cookies);

HttpContext.Current.Session.Add("AdminID", Dt.Rows[0]["ID"].ToString());
HttpContext.Current.Session.Add("AdminName", Dt.Rows[0]["UserName"].ToString());
Cookies = new HttpCookie("AdminInfo");

Cookies.Values["AdminID"] = Dt.Rows[0]["ID"].ToString();
Cookies.Values["AdminName"] = Dt.Rows[0]["UserName"].ToString();
Cookies.Expires = DateTime.Now.AddHours(1);//可不设置或者设置成0(代表在关闭浏览器后,立即失效)
HttpContext.Current.Response.AppendCookie(Cookies);        


2、登陆状态判断

if (System.Web.HttpContext.Current.Request.Cookies["AdminInfo"] == null)
{
//Cookies已经丢失,这里将重定向到登陆页面
}
if (System.Web.HttpContext.Current.Session["AdminID"] == null)
{
        System.Web.HttpContext.Current.Session["AdminID"] = System.Web.HttpContext.Current.Request.Cookies["AdminInfo"]["AdminID"].ToString();
}
string AdminID=System.Web.HttpContext.Current.Session["AdminID"].ToString();
if (AdminID== "")
{
//假如用户ID值不存在,跳转到登陆页面
 }
else
{
        //根据用户ID获取该管理员的相关信息,例如权限值等
        HttpContext.Current.Session.RemoveAll();
        HttpContext.Current.Session.Timeout = 300;
        HttpContext.Current.Session["UserName"] ="";
}

问题:
1、为什么不全部使用Cookies作为用户登陆信息的保存值?
       初步考虑到Cookies值有大小的限制,有些属性也不应该作为Cookies存放到客户端,这里最好对Cookies进行一个加密的操作,保证数据的安全。
2、Session为何即使设计了20分钟,但往往会马上就过期了?
      初步估计是因为Session是根据服务器的信息来的,是存放在服务器端的内存中的,当服务器端内存一吃紧在做释放工作之后,用户信息当然会丢失了。


Session 是一种在 Web 应用程序中跟踪用户状态的机制。在用户登录时,可以创建一个 session,将用户的身份验证信息存储在 session 中,并将 session ID 存储在 cookie 中发送给客户端,以便于后续的访问。 以下是一个简单的实现方法: 1. 在用户登录成功时,创建一个 session,并将用户信息存储在其中。例如: ``` session_start(); $_SESSION['user_id'] = $user_id; ``` 2. 将 session ID 存储在 cookie 中发送给客户端。例如: ``` setcookie('session_id', session_id(), time() + 3600, '/'); ``` 其中,第一个参数为 cookie 的名称,第二个参数为 session ID,第三个参数为过期时间(这里设置为一个小时),第四个参数为 cookie 的路径。 3. 在后续的请求中,通过检查 cookie 中的 session ID 来验证用户的身份。例如: ``` session_start(); if (!isset($_SESSION['user_id']) || empty($_COOKIE['session_id']) || $_COOKIE['session_id'] != session_id()) { header('Location: login.php'); exit; } ``` 其中,第一行代码开始或恢复一个 session,第二行代码检查 session 中是否保存用户信息,第三行代码检查 cookie 中是否包含 session ID,第四行代码检查 cookie 中的 session ID 是否与当前 session ID 相同。如果任何一个条件不满足,则重定向到登录页面。 注意:为了保护 session 的安全性,需要在服务器端禁用 session ID 的传递,以避免 session fixation 攻击。可以通过设置 session.use_only_cookies 为 true 来实现这一点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值