黑马训练营自学笔记(04)
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
IsPostBack的作用以及实现原理。
一:IspostBack原理分析,及在ashx中的实现
在WebForm中的Page对象拥有一个IsPostBack属性,其作用是标识页面是第一次加载,还是为了响应回发而加载。IsPostBack为false的话就是第一次被加载,为true就是为了响应回发而加载。
用一般处理程序(ashx)进行Asp.Net开发的时候,我们也需要自己动手去实现这个功能。方法就是获取某个表单元素的值来进行判断,如果这个表单元素的值为空,则说明是第一次直接访问(因为第一次访问表单没提交,肯定获取值为空),反之就是表单提交后为了响应回发而加载。获取的这个表单元素通常有两种:一种是专门用一个隐藏域表单,另一种通常就是获取提交按钮的值。下面分别实现。
(1)获取提交按钮的值
Login_Submit.html模版页代码:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <style> span { display:block; } </style> </head> <body> <form action="Login_Submit.ashx" method="post"> <span>用户:<input type="text" name="username" /></span> <span>密码:<input type="password" name="pass"/></span> <span><input type="submit" value="提交" name="submit"/></span> </form> </body> </html>
Login_Submit.ashx代码:
<%@ WebHandler Language="C#" Class="Login_Submit" %> using System; using System.Web; public class Login_Submit : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html"; string ispostback = context.Request["submit"];//获取提交按钮的值 if (string.IsNullOrEmpty(ispostback))//如果是第一次进入,显示登录界面 { context.Response.Write("第一次进入"); string content = System.IO.File.ReadAllText(context.Server.MapPath("Login_Submit.html")); context.Response.Write(content); } else { context.Response.Write("表单提交后进入"); } } public bool IsReusable { get { return false; } } }
(2)用一个专用的隐藏域实现.
Login_hidden.html代码:
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <style> span { display:block; } </style> </head> <body> <form action="Login_hidden.ashx" method="post"> <span>用户:<input type="text" name="username" /></span> <span>密码:<input type="password" name="pass"/></span> <span><input type="submit" value="提交" name="submit"/></span> <input type="hidden" name="ispostback" value="true"/><!--这里用了一个专门的隐藏域--> </form> </body> </html>
Login_hidden.ashx代码:
<%@ WebHandler Language="C#" Class="Login_hidden" %> using System; using System.Web; public class Login_hidden : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/html"; string ispostback = context.Request["ispostback"];//获取隐藏域的值 if (ispostback!="true")//如果是第一次进入,显示登录界面 { context.Response.Write("第一次进入"); string content = System.IO.File.ReadAllText(context.Server.MapPath("Login_hidden.html")); context.Response.Write(content); } else { context.Response.Write("表单提交后进入"); } } public bool IsReusable { get { return false; } } }
二、疑问。
(1)上面ashx是先的IsPostBack是可以轻易的伪造的,虽然表单中的method="post"是采用post方式进行数据的提交,可我实验的时候发现仍然可以通过get方式进行表单的提交。也就是只需采用Login_Submit.ashx?submit=%E6%8F%90%E4%BA%A4就可以伪造第一种的提交。用Login_hidden.ashx?ispostback=true就可以伪造第二种的提交。这样就是不安全的。
(2)虽然知道了WebForm中IsPostBack的实现原理,但是不知道究竟具体是怎么实现的。如果说是放在ViewState中的话,发现禁用了ViewState仍然正常使用IsPostBack。至于是否是获取提交表单按钮的值实现就不清楚了。
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------