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;
}
}
}
}