程序员看淘宝,如何用Session保存用户状态

开发 后端
每个用户都有一个Session对象相对应,当用户想要跳转到任意跟账户有关的界面(已买到的宝贝页面),每个页面加载的时候都要判断Session对象保存的用户状态。

网上购物已经成为现在生活不可缺少的一部分。我们上淘宝只是为了消费,今天换一个角度,用程序员的眼光看看淘宝。

如上图:

情况一:当打开一些和账户有关的网页,检测用户没有登录,系统自动会跳转到登录界面。

情况二:当检测到已经有用户登录,页面会自动跳转到目的页面。

问题:系统如何检测用户是否登录,如何保存用户的登录状态?

下面说说自己的理解:利用Session保存用户状态,

解决方案一:每个用户都有一个Session对象相对应,当用户想要跳转到任意跟账户有关的界面(已买到的宝贝页面),每个页面加载的时候都要判断Session对象保存的用户状态。

1. 登录界面的代码:

  1. public partial class Login : System.Web.UI.Page  
  2.    {  
  3.        protected void Page_Load(object sender, EventArgs e)  
  4.        {  
  5.        }  
  6.        protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)  
  7.        {  
  8.            Session["UserFlag"] = false;//首先设置会话值UserFlage表示用户是否登录  
  9.            if (UserVolidate(Login1.UserName, Login1.Password) == true)//调用自定义方法,验证用户是否登录成功  
  10.            {  
  11.                Session["UserFlag"] = true//登录成功  
  12.                e.Authenticated = true;  
  13.                Response.Redirect("Main.aspx"); //跳转主界面  
  14.            }  
  15.            else{  
  16.                Response.Write("未登录"); //否则提示未登录  
  17.            }  
  18.        }  
  19.        /// <summary>  
  20.        /// 用户登录验证  
  21.        /// </summary>  
  22.        /// <param name="userName">用户名</param>  
  23.        /// <param name="userPassword">用户密码</param>  
  24.        /// <returns>bool</returns>  
  25.        private bool  UserVolidate(String userName, String userPassword)  
  26.        {  
  27.            //连接数据库  
  28.            SqlConnection con = new SqlConnection("server=.;database=User;uid=sa;pwd=123456;");  
  29.            con.Open();  
  30.            SqlCommand cmd=new SqlCommand ("select * from UserInfo where UserName="+userName +" and Password="+userPassword );  
  31.            int num=cmd.ExecuteNonQuery ();  
  32.            if (num>0)  
  33.            {  
  34.               return true;  
  35.            }  
  36.            else 
  37.            {  
  38.                return false;  
  39.            }  
  40.        }  
  41.          
  42.    } 

2. 跳转界面的代码:(防止用户通过URL直接跳转到该界面,每次界面都要进行判断)

  1. public partial class Main : System.Web.UI.Page  
  2.    {  
  3.        //窗体加载  
  4.        protected void Page_Load(object sender, EventArgs e)  
  5.        {  
  6.            //根据Session对象保存的用户登陆状态判断用户是否登录  
  7.            if (Session["UserFlag"].ToString () == "false")  
  8.            {  
  9.                //如果未登录,则直接跳转到登录界面  
  10.                Response.Redirect ("Login.aspx");  
  11.            }  
  12.        }  
  13.    } 

解决方案二:通过提供一个中介judge.aspx界面,每个跟账户有关的界面跳转之前都跳转到该界面,通过该界面加载的时判断用户的登录状态。

1. 登录页面代码不变

2. judge.aspx页面代码:

  1. public partial class judge : System.Web.UI.Page  
  2.     {  
  3.         protected void Page_Load(object sender, EventArgs e)  
  4.         {  
  5.             //对Session对象进行判断用户的状态  
  6.  
  7.             if (Session["flag"].ToString()=="false")  
  8.             {  
  9.                 Response.Write("未登录");  
  10.             }  
  11.  
  12.             /*else  
  13.             {  
  14.                 Response.Redirect("Main.aspx");//加上这句话会造成死循环  
  15.             }*/ 
  16.         }  
  17.     } 

3. 跳转界面代码:

  1. public partial class Main : System.Web.UI.Page  
  2.     {  
  3.         protected void Page_Load(object sender, EventArgs e)  
  4.         {  
  5.             //跳转页面必须经过判断,防止直接登录该页面,而不进行登录。  
  6.             Server.Execute("judge.aspx");//通过执行Server对象的Execute方法  
  7.         }  
  8.     } 

总结:两种解决方案原理相同,通过Session对象保存用户状态,不同页面都可以通过访问该用户的Session对象的会话值来判断该用户的状态。解决方案二只是简化了判断过程,通过Server对象的Execute方法先执行中介判断界面,然后回归到原程序执行顺序。

补充:

Server对象

语法:Server.Execute(path)

用途:这个方法是 IIS5.0 新增的功能,用途类似程序语言中的函数调用,也就是说,您可以在 ASP 程序中使用 Server.Execute(path)方法调用 Path 指定的 ASP 程序,待被调用的程序执行完毕之后再返回原来的程序,继续执行接下来的指令。

Session对象

在网站中,每个新访问的用户都将产生自己的session(回话)对象。这个session对象在服务器端进行管理,只能为当前访问的用户服务。如果另一个用户进入网站,也将拥有自己的session对象,两个用户的session对象即使同名,也不能共享。

原文链接:http://blog.csdn.net/yinjingjing198808/article/details/7832769

【编辑推荐】

  1. 各自为政:ASP.NET实现团队分工的思考
  2. 仿造百度实现基于Lucene.net全文检索
  3. 发布一个自己写的企业站源码
  4. ASP.NET中常用的几种身份验证方式
  5. ASP.NET中使用App_Code文件夹的异常
责任编辑:张伟 来源: yinjingjing198808的博客
相关推荐

2016-04-28 11:17:33

互动出版网

2018-01-09 20:29:15

程序员日本程序员中国程序员

2011-05-30 13:43:16

OOD编程对象

2011-05-10 13:37:53

程序员

2012-09-19 09:21:59

2012-09-20 09:19:30

程序员非程序西方程序员

2019-01-18 09:32:57

2011-05-30 14:23:11

设计模式程序员

2012-11-12 09:35:24

开发工具程序员IE6

2011-07-19 13:04:22

网络协议网络编程

2013-12-30 10:08:13

2020-09-23 12:30:26

session

2020-04-04 20:59:28

程序员技术开发

2015-04-09 13:36:13

程序员大龄程序员出路

2010-10-18 11:18:44

程序员

2014-03-04 09:43:23

程序员外包

2014-09-22 09:42:54

程序员

2012-03-06 09:22:46

程序员

2013-08-20 09:33:59

程序员
点赞
收藏

51CTO技术栈公众号