ASP.NET中级学习1
1. 特殊路径标志“~”
和“/”表示网站根目录(跟域名相关),../表示上级目录、./表示当前目录等Http标准定位不一样,“~”,~是ASP.NET定义的特殊符号,是ASP.NET内部定义推荐的方法,推荐资源定位都使用“~”从应用根目录开始定义。
编程处理“~”,如果在服务器控件中,会自动将~进行转换,如果在html控件或者需要在代码中转换可以使用VirtualPathUtility类中的静态方法进行虚拟路径、全路径等的转换,比如VirtualPathUtility.ToAbsolute(“~/a/b.sapx”)
2. Request对象
Response.Write(Request.AppRelativeCurrentExecutionFilePath);//获取应用程序在网站内的虚拟路径
//比如这个例子将打印出的虚拟路径为~/Request/RequestTest.aspx
Response.Write("<br/>"+Request.PhysicalApplicationPath);//获取当前程序的物理路径(服务器硬盘中的路径)
//比如这个例子的E:\学习资料\ASPNET\ASP.NET中级学习\
Response.Write("<br/>"+Request.PhysicalPath);//打印出当前页面的物理路径
//E:\学习资料\ASPNET\ASP.NET中级学习\Request\RequestTest.aspx
用Request.UrlReferrer防盗链,判断图片页面的UrlReferrer是否来源于本站,不是的话就给出提示信息和相关处理。
Response对象
响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器write的数据默认并不是没write一次都会立即输出到浏览器,而是会缓存数据,到合适的时候或者响应结束才会将缓存区中的数据一起发送到浏览器。
Response对象的主要成员:
1.Response.Buffer、Response.BufferOutPut,两个属性是一样的,Buffer内部就是调用的BufferOutPut。这个属性用来控制是否采用响应缓存,默认是true。(除非有特殊需求,一般不用去改它)
2.Response.Fush()将缓冲区的数据发送到浏览器,如果需要将wirte出来的数据立即输出到浏览器的场合,用这个是非常合适的。案例:大批量数据的导入,显示正在导入第几条数据,用Thread.Sleep模拟耗时。
context.Response.ContentType = "text/html";
for (int i = 1; i < 20; i++)
{
System.Threading.Thread.Sleep(500);
context.Response.Write("第"+i+"步执行完成<br/>");
context.Response.Flush(); //可以看到浏览器中的数据一条一条的打印出来,而不是之前那样刷一下全部打印出。
}
3. Response.Clear() 清除缓冲区中的内容,这样做,缓冲区内的数据直接删除掉。
4. Response.ContentEncoding 可以用来设置和获取输出流的编码格式,但一般情况下不必设置。
5. Response.ContentType 输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)JPEG图片(image/JPEG)
6. Reponse.Cookies返回给浏览器的cookie的集合,可以通过它设置cookie。但是我们可以直接用Response.SetCookie(c);其实内部处理,它帮你Response.Cookies.Add(c);
7. Response.OutPutStream输出流,在输出图片、excel文件等非文本文件的时候要使用它。例如:bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);将一个图片输入到浏览器中。
8. Response.End();终止页面请求,不再往下执行了。将之前缓存中的数据发送到浏览器,在终止一些非法请求的时候,比如盗链等可以用End()立终止请求。
Response.Write("当Ì¡À前¡ã网ª?站?禁?止1访¤?问¨º!ê?");
Response.End(); //终止请求。不再往下执行了。
Response.Write("你看不到我!");
9. Response.Redirt(“http://www.rupeng.com”);重定向到新的页面,新的资源(如图片等),可以导航本站之外的网址。
10. Response.SetCookie(HttpCookie cookie),向输出流中更新写到浏览器中的cookie。是对Response.Cookies的简化调用。
11. Response.Write()向浏览器输出内容。
12. Response.WriteFile()向浏览器中输出文件,比如Response.Write(“c/boot.ini”);
Server对象
Server是context的一个属性,是HttpServerUtility类的一个对象
Server.HtmlDecode() , Server.HtmlEncode() html编码,防止xss漏洞
Server.UrlEncode() Server.UrlDecode() 网站url地址编码。处理超链接的。
用HttpUtility也能点出这四个方法,因为有的地方很难拿到Server对象。
Server.Transfer()内部重定向请求,将用户的请求重定向给另一个页面处理,是服务器内部的接管,浏览器是意识不到这个接管的。不像Response.Redirect那样经历:通知浏览器重新访问url地址—>浏览器接受命令访问另一个页面à返回给用户这个过程。因此浏览器地址栏不会变化。因为是内部接管,所以在被重定向到的页面中是可以访问到Request,cookies等这些来源页面接受的参数的,就像这些参数也是传递过去一样。
注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。
使用Server.Transfer不能直接重定向到ashx,否则会报错“执行子请求出错”
有时候不能拿到HttpContext对象,比如在Global.asax,可以通过HttpContext.Current拿到当前的HttpContext,进而拿到Response,Request,Server等。
HttpHandler1
1. 动态生成搞笑图片,在某个图片的某个位置动态的写入字符串,其功能就跟logo网站生成图片一样。
2. 让浏览器弹框下载:如果输出的是html,txt,jpeg等类型的信息,浏览器会直接显示,如果希望弹出保存对话框,则需要添加Header:context.Response.ContentType = "image/JPEG";
string filename = HttpUtility.UrlEncode("杨凤辉.jpg");
context.Response.AddHeader("Content-Disposition","attachment;filename="+filename);//添加报文头到输出流
context.Response.WriteFile("杨凤辉.jpg"); //把文件写到浏览器输出流中。
添加报文头,让浏览器以attachment的形式打开文件(即下载附件)
application/x-excel 下载Excel表格时候的内容类型 ContentType=” application/x-excel”。 application/octet-stream 下载所有文件都ok。
动态创建Excel表格
context.Response.ContentType = "application/x-excel";
string filename = HttpUtility.UrlEncode("动态数据.xls");context.Response.AddHeader("Content-Disposition","attachment;filename="+filename);
//建立新的 Excel 工作簿
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
//在 Excel 工作簿中建立工作表,名稱為 Sheet1
HSSFSheet sheet1 = hssfworkbook.CreateSheet("bitch");
//寫入資料到工作表中
sheet1.CreateRow(1).CreateCell(0).SetCellValue("hello");
sheet1.CreateRow(2).CreateCell(0).SetCellValue("3.14"); sheet1.CreateRow(3).CreateCell(0).SetCellValue("Are you bitch??"); //将新建的Excel表格写到浏览器缓冲区中。 hssfworkbook.Write(context.Response.OutputStream);
图库练习:登录处理,防暴力破解:在用户表里面增加两个字段,一个是锁定标志IsLock,和一个锁定后一定时间后方可重新试登录的OpenTime地段。
如果用户连续五次登录密码都错,那么就设置IsLock为1,同时开放时间为当前时间加上30分钟。
if (user.IsLock == 0) //防暴力破解
{
if (tryCount < 5)
{
tryCount++;
if (user.PassWord == TextBox2.Text.Trim())
{
tryCount = 0;
Session["UserId"] = user.Id;
Session["UserName"] = user.UserName;
Response.Redirect("PicDownload.html");
}
else
{
Label1.Text = "密码错误!";
}
}
else
{
adapter.UpdateDataByUserName(1, DateTime.Now.AddMinutes(2), TextBox1.Text.Trim());
Label1.Text = "五次尝试密码均错该账户已被锁住,请三十分钟后再试!";
tryCount=0;
}
}
else if (user.IsLock == 1)
{
if(DateTime.Compare(user.OpenTime, DateTime.Now) > 0)
{
Label1.Text = "该账户已被锁住,请三十分钟后再试!";
}
else
{
adapter.UpdateDataByUserName(0, null, TextBox1.Text.Trim());
tryCount++;
if (user.PassWord == TextBox2.Text.Trim())
{
tryCount = 0;
Session["UserId"] = user.Id;
Session["UserName"] = user.UserName;
Response.Redirect("PicDownload.html");
}
else
{
Label1.Text = "密码错误!";
}
}
}
在一般处理程序页面中,如果需要用到session的话,必须先让这个页面的类实现IRequiresSessionState接口
功能:指定目标Http处理程序需要对回话状态值具有读写访问权利,这只是一个标志接口,没有任何方法。
public class PicDownload : IHttpHandler, IRequiresSessionState