session的介绍?

1、session是可以存取任何类型的数据的,但是cookie只能存入字符串。

2、Session读取的时候是Object类型的,所以在读取的时候要进行(强制类型的转换)

3、Session是依赖与cookie的不同浏览器之间是不能公用session的

4、Session默认20分钟。 服务器压力过大可能提前就将进程内的session释放带掉

5、一般处理程序如果没有实现接口就会报错

6

一个简单的案例:

第7节:

1、不建议使用table进行页面的左右和上下布局。

2、一旦抛出异常,服务器会重新启动。

1、用户名登陆界面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form action="sessiontest1.ashx" method="post">
        <table>
            <tr><td>用户名:</td><td><input type="text" name="username" /></td></tr>
            <tr><td>密  码:</td><td><input type="password" name="pwd" /></td></tr>
            <tr><td><input type="submit" name="btn1" value="登陆" /></td><td>{msg}</td></tr>
        </table>
    </form>
</body>
</html>

2、为了以后方便加处理代码,以后用户都访问.ashx,而不是直接访问html登陆页面的,好处是方便对html页面进行初始化的操作。

3、用户登陆的验证:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using Web1.Day3;
 
namespace Web1.Seession
{
    /// <summary>
    /// sessiontest1 的摘要说明
    /// </summary>
    public class sessiontest1 : IHttpHandler
    {
        //为了以后方便加处理代码,以后用户都访问.ashx,而不是直接访问html
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            //1、从请求报文中读取,btn1
            string btnLogin = context.Request["btn1"];
            //2、读取html页面
            string html = CommonHelper.ReadHtml("~/Seession/sessiontest1.html");
            //3、判断
            if (string.IsNullOrEmpty(btnLogin))
            {
                //4、初始化登陆页面,{msg}
                html = html.Replace("{msg}","");
                context.Response.Write(html);
            }
            else
            {
                //5、否则从请求报文中读取用户名和密码的
                string username = context.Request["username"];
                string pwd = context.Request["pwd"];
                //6、到数据库中查询
                int count = (int)SqlHelper.ExecuteScalar(
                    "select count(*) from T_Users where Name=@Name and Password=@Password",
                    new SqlParameter("@Name", username), new SqlParameter("@Password", pwd));
                //7、根据返回的整数判断
                if (count <= 0)
                {
                    //8、替换{msg}
                    html = html.Replace("{msg}", "登陆失败!");
                    context.Response.Write(html);
                }
                else
                {
                    context.Response.Redirect("ChangePassword.ashx");
                }
            }
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

4、下面将登陆成功后的“用户名”存入到Session 中

if (count <= 0)
                {
                    //8、替换{msg}
                    html = html.Replace("{msg}", "登陆失败!");
                    context.Response.Write(html);
                }
                else
                {
                    context.Session["loginname"]=username;//将用户名存入到session中,这样其它页面就可以读取这个session
                    context.Response.Redirect("ChangePassword.ashx");

5、新建一个 改变密码的一般处理程序,(只有登陆成功!才可以修改此该密码嘛!)读取Session中存入的用户名信息!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
 
namespace Web1.Seession
{
    /// <summary>
    /// ChangePassword 的摘要说明
    /// </summary>
    public class ChangePassword : IHttpHandler,IRequiresSessionState
    {
 
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
 
           string username= (string)context.Session["loginname"];
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

6、小技巧::此时做一个处理,使用一个常量,声明Session的名字,主要是改名字太长,又被多出引用!这样处理大家都错,或着都对,目的:为了避免出错!

改进如下:

context.Session[sessiontest1.LOGINNAME]=username;//引用类名,就可以方便点出啦!

7、判断用户名是否为空

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
 
namespace Web1.Seession
{
    /// <summary>
    /// ChangePassword 的摘要说明
    /// </summary>
    public class ChangePassword : IHttpHandler, IRequiresSessionState//1、实现接口,这是个标志接口,里边没有方法
    {
 
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            //1、从session中读取用户名
            string username = (string)context.Session[sessiontest1.LOGINNAME];
            //2、判断用户名是否为空
            if (username == null)//如果没登陆,则重定向登陆页面
            {
                context.Response.Redirect("sessiontest1.ashx");
            }
            else
            {
                context.Response.Write(username + "您好,请按提示修改密码:");
            }
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

8、对7中的判断可以处理这样的情况,当你这节访问http://localhost:55725/Seession/ChangePassword.ashx

修改密码这个页面的时候。它会先从Session中检查,用户名是否存在,不存在就会重定向登陆页面。(这个用Session这个特点~!!,其他的用请求报文Require[“username”]也行!!!)

9、同样对于其他的页面登陆检查就可以直接复用这些代码;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState; 
namespace Web1.Seession
{
    /// <summary>
    /// QueryYuE 的摘要说明
    /// </summary>
    public class QueryYuE : IHttpHandler, IRequiresSessionState//1、实现接口,这是个标志接口,里边没有方法
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            
            //这里做个用户名是否存在检查,,直接复用代码就行-------------
            context.Response.ContentType = "text/html";
            //1、从session中读取用户名
            string username = (string)context.Session[sessiontest1.LOGINNAME];
            //2、判断用户名是否为空
            if (username == null)//如果没登陆,则重定向登陆页面
            {
                context.Response.Redirect("sessiontest1.ashx");//返回登陆页
            }
            else
            {
                context.Response.Write(username + "您好,欢迎查看余额:");
            }
        }
 
        public bool IsReusable
        {
            get
            {
               return false;
            }
        }
    }
}

10、问题:当你在上网的时候,例如百度云,你没有输入账号,就打开了一个页面,当你输入你的账号后,为了,实现,页面登陆后重新,跳转会原来的登陆页面;(简记:从哪个页面重定向登陆的,登陆后还重定向这个页面

解决:1)在登陆一般处理程序中设定一个常量

public const string LOGINBEFOREURL = "loginTryUrl";//尝试登陆时候的页面地址

2)来到修改密码一般处理程序中,此时如果用户名为空,就会跳转到登陆页面,此时,当前修改密码页面的url地址存到一个Session中。

//2、判断用户名是否为空
            if (username == null)//如果没登陆,则重定向登陆页面
            {
                //11、获取当前地址,并存入到session中(存),地址记得类型转换
                context.Session[sessiontest1.LOGINBEFOREURL] = context.Request.Url.ToString();
                context.Response.Redirect("sessiontest1.ashx");//返回登陆页面
 
            }
            else
            {
                context.Response.Write(username + "您好,请按提示修改密码:");
         }

3)返回登陆页面进行,读取Session

//7、根据返回的整数判断
                if (count <= 0)
                {
                    //8、替换{msg}
                    html = html.Replace("{msg}", "登陆失败!");
                    context.Response.Write(html);
                }
                else
                {
                    //9、登陆成功,页面跳转!并//将用户名存入到session中,这样其它页面就可以读取这个session
                    context.Session[sessiontest1.LOGINNAME]=username;
                    // 这  context.Response.Redirect("ChangePassword.ashx");
 
                    //12、读取存入登陆前页面的url地址,从Session中(读)
                    string navUrl =(string)context.Session[sessiontest1.LOGINBEFOREURL];
                    //13、如果你登陆前的地址有,就重定向登陆前的页面
                    if (navUrl!=null)
                    {
                        context.Response.Redirect(navUrl);
                    }
       }

11、可以通过开发者工具查看;

12、(不好理解,再看~~~~~~~~~~~~~~~~~)

13、增加退出登陆的超链接!(使用这个方法)

15、创建推出登陆一般处理程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
namespace Web1.Seession
{
    /// <summary>
    /// LoginOut 的摘要说明
    /// </summary>
    public class LoginOut : IHttpHandler, IRequiresSessionState
    {
 
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            //1、从服务器中销毁session
            context.Session.Abandon();
            //2、session销毁,表示用户名丢失。。所以重定向登陆页面
            context.Response.Redirect("sessiontest1.ashx");
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

16、设置一个推出连接QueryYuE .ashx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
 
namespace Web1.Seession
{
    /// <summary>
    /// QueryYuE 的摘要说明
    /// </summary>
    public class QueryYuE : IHttpHandler, IRequiresSessionState//1、实现接口,这是个标志接口,里边没有方法
    {
 
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            
            //这里做个用户名是否存在检查,,直接复用代码就行-------------
            context.Response.ContentType = "text/html";
            //1、从session中读取用户名
            string username = (string)context.Session[sessiontest1.LOGINNAME];
            //2、判断用户名是否为空
            if (username == null)//如果没登陆,则重定向登陆页面
            {
                context.Response.Redirect("sessiontest1.ashx");//返回登陆页面
 
            }
            else
            {
                context.Response.Write(username + "您好,欢迎查看余额:"+"<a href='LoginOut.ashx'>推出登陆</a>");
            }
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

17、在导航页面进行重定向设置

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using Web1.Day3;
 
namespace Web1.Seession
{
    /// <summary>
    /// sessiontest1 的摘要说明
    /// </summary>
    public class sessiontest1 : IHttpHandler, IRequiresSessionState//10、 实现接口,shift+alt+f10导入命名
    {
        public const string LOGINNAME = "loginname";
        public const string LOGINBEFOREURL = "loginTryUrl";//尝试登陆时候的页面地址
 
        //为了以后方便加处理代码,以后用户都访问.ashx,而不是直接访问html
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/html";
            //1、从请求报文中读取,btn1
            string btnLogin = context.Request["btn1"];
            //2、读取html页面
            string html = CommonHelper.ReadHtml("~/Seession/sessiontest1.html");
            //3、判断
            if (string.IsNullOrEmpty(btnLogin))
            {
                //4、初始化登陆页面,{msg}
                html = html.Replace("{msg}", "");
                context.Response.Write(html);
            }
            else
            {
                //5、否则从请求报文中读取用户名和密码的
                string username = context.Request["username"];
                string pwd = context.Request["pwd"];
                //6、到数据库中查询
                int count = (int)SqlHelper.ExecuteScalar(
                    "select count(*) from T_Users where Name=@Name and Password=@Password",
                    new SqlParameter("@Name", username), new SqlParameter("@Password", pwd));
                //7、根据返回的整数判断
                if (count <= 0)
                {
                    //8、替换{msg}
                    html = html.Replace("{msg}", "登陆失败!");
                    context.Response.Write(html);
                }
                else
                {
                    //9、登陆成功,页面跳转!并//将用户名存入到session中,这样其它页面就可以读取这个session
                    context.Session[sessiontest1.LOGINNAME] = username;
 
 
                    //12、读取存入登陆前页面的url地址,从Session中(读)
                    string navUrl = (string)context.Session[sessiontest1.LOGINBEFOREURL];
                    //13、如果你登陆前的地址有,就重定向登陆前的页面
                    if (navUrl != null)
                    {
                        context.Response.Redirect(navUrl);
                    }
                    else
                    {
                        context.Response.Redirect("ChangePassword.ashx");//默认进入密码修改页
                    }
 
                }
            }
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 员工Emp表的增删改查实现!本实验室目的是为了了解模板页的好处!

    细节;id 还是 i -----------------------;;半个笑死

    静心物语313
  • 第 4 节: 4-Cookie实现记住用户名

    静心物语313
  • Http协议时无状态的,没有记忆功能,连接--传送--断开

    private 字段十+,然后输出到页面上,然后重复刷新页面。服务器不记的上次给了浏览器什么,否则服务器的压力会太大。

    静心物语313
  • Asp.Net WebApi 调试利器“单元测试”

    当我们编辑好一个WebApi应用程序后,需要对该Api接口进行调试,传统的调试办法是在方法内设置断点,然后用PostMan等http工具模拟访问进行查看WebA...

    码农阿宇
  • 在路上:安全公司“跨界”SD-WAN

    编者按:本文是SDNLAB“企业+”特别报道之一。“企业+”是SDNLAB重点打造的栏目,汇聚信息行业运营商、设备商、互联网公司、软件公司、集成公司、融创投资公...

    SDNLAB
  • 数据加密、区块链、可信计算、Serverless…丨Techo云安全专场七大前沿议题拆解

    11月6日-7日,首届腾讯 Techo 开发者大会在北京举行。在这场持续2天的技术盛宴中,全球5000多位开发者、超140位中外业界大咖齐聚一堂,带来了18场...

    云鼎实验室
  • Android自定义View实现数字密码锁

    最近项目上用到一个密码加锁功能,需要一个数字密码界面,就想着封装成一个View来方便管理和使用。

    砸漏
  • Springcloud之Zuul的RibbonRoutingFilter

        spring-cloud-netflix-zuul的版本是2.1.2.release.

    克虏伯
  • 支付业务优化else if 代码

    最近在做项目的时候,需要接入支付。由于接入第三方支付而且还不止一家,需要接入很多家。比如说支付宝、微信、富友支付等。每家支付都一个回调。现如今的代码,根据不同的...

    java金融
  • Spring框架中的设计模式(四)​

    本文是Spring框架中使用的设计模式第四篇。本文将在此呈现出新的3种模式。一开始,我们会讨论2种结构模式:适配器和装饰器。在第三部分和最后一部分,我们将讨论单...

    程序猿DD

扫码关注云+社区

领取腾讯云代金券