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