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

[复制链接]
查看: 81|回复: 2
  • 慵懒
    2018-4-28 09:37
  • 发表于 2018-4-3 09:08:07 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x

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

    98775cbc5b6894d1f7c781267dc20cfb.jpg

    如上图:

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

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

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

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

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

    1. 登录界面的代码:

    • public partial class Login : System.Web.UI.Page
    •    {
    •        protected void Page_Load(object sender, EventArgs e)
    •        {
    •        }
    •        protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    •        {
    •            Session["UserFlag"] = false;//首先设置会话值UserFlage表示用户是否登录
    •            if (UserVolidate(Login1.UserName, Login1.Password) == true)//调用自定义方法,验证用户是否登录成功
    •            {
    •                Session["UserFlag"] = true; //登录成功
    •                e.Authenticated = true;
    •                Response.Redirect("Main.aspx"); //跳转主界面
    •            }
    •            else{
    •                Response.Write("未登录"); //否则提示未登录
    •            }
    •        }
    •        ///
    •        /// 用户登录验证
    •        ///
    •        /// 用户名
    •        /// 用户密码
    •        /// bool
    •        private bool  UserVolidate(String userName, String userPassword)
    •        {
    •            //连接数据库
    •            SqlConnection con = new SqlConnection("server=.;database=User;uid=sa;pwd=123456;");
    •            con.Open();
    •            SqlCommand cmd=new SqlCommand ("select * from UserInfo where UserName="+userName +" and Password="+userPassword );
    •            int num=cmd.ExecuteNonQuery ();
    •            if (num>0)
    •            {
    •               return true;
    •            }
    •            else
    •            {
    •                return false;
    •            }
    •        }
    •    }

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

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

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

    1. 登录页面代码不变

    2. judge.aspx页面代码:

    • public partial class judge : System.Web.UI.Page
    •     {
    •         protected void Page_Load(object sender, EventArgs e)
    •         {
    •             //对Session对象进行判断用户的状态
    •             if (Session["flag"].ToString()=="false")
    •             {
    •                 Response.Write("未登录");
    •             }
    •             /*else
    •             {
    •                 Response.Redirect("Main.aspx");//加上这句话会造成死循环
    •             }*/
    •         }
    •     }

    3. 跳转界面代码:

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

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

    补充:

    Server对象

    语法:Server.Execute(path)

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

    Session对象

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


    发表于 2018-4-26 14:09:11 | 显示全部楼层
    啥也不说了,感谢楼主分享哇!
    回复

    使用道具 举报

    发表于 2018-6-22 03:34:54 | 显示全部楼层
    确实是难得好帖啊,顶先
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

     
     
    技术支持
    在线客服
    售后交流群瑞恩社区™售后</font><br><span>交流
    工作时间:
    8:00-18:00
    客服热线:
    15368564009
    微信扫一扫
    返回顶部 关注微信 下载APP 返回列表