asp.net笔记----Web开发的一些基本原则和一些对象方法,笔记有点乱!!
时间:2011-05-10 来源:八-戒
Web开发的一些基本原则.
最小权限原则。只允许用户做“…” 而不是“不允许用户做…”
C#代码是运行在服务器端的,JS代码是运行在客户端的.
能在浏览器端完成的事情,就不要到服务端去做.
客户端是不可信的.
不要轻信用户提交上来的数据.
Xss跨站脚本漏洞。
特殊路径标识”~”
和“/表示网站根目录(域名)”, ../表示上级目录,./表示当前目录“
a.aspx
./a.aspx
(效果一样)
等Http 标准定位不一样,~是ASP.Net定义的特殊符号,是ASP.net内部进行定义推荐的用法,推荐资源定位都使用~从应用根目录开始定义,应用根目录和网站根目录的区别在于:如果将一个应用部署到”http:www.xxx.com/aaa”这个目录下,应用的根目录是”http:www.xxx.com/aaa”,网站的根目录是”http:www.xxx.com/”,因此最好用”~“,”~”并不会被浏览器认,因为ASP.net会将这个路径转换为相对于网站的根目录的全路径再输出到浏览器.
~表示项目根目录!!!.
Default.aspx的问题,如果访问”/”不带文件名,就访问默认页面(Default.aspx,default.html,index.html等).
编程处理“~“
如果在服务端控件中(使用runat=server的控件)会自动将“~“进行转换,如果在HTML控件或者需要在代码中转换的话可以使用VirtualPathUtility类中静态方法进行虚拟路径,全路径的转换,比如:virtualPathUitilty.ToAbsolute(“~/a/b1/aspx”)就是将虚拟路径转换为相对于应用根的全路径,也就是/WebSite/a/b1/aspx
VirtualPathUtility不会判断路径是否存在!.
Page类的ResolveClientUrl也可以实现.运算出来的是相对当前页面的路径.
virtualPathUitilty.ToAbsolute运算出来的是相对于网站的根目录的绝对路径.
Request对象
Request.AppRelativeCurrentExecutionFilePath.获取当前执行请求相对于于应用根目录的虚拟路径,以~开头。效果:
Request.PhysicalApplicationPath获取当前应用的物理路径,效果:
Request.PhysicalPath获取当前请求的物理路径,效果:
Request.RawUrl获得原始请求URL,Request.Url获得请求的URL,区别涉及到URL重写的问题.效果:
Request.Url 效果:
Request.UrlReferrer网页的来源,可以根据这个判断从百度搜的哪儿个关键词,防下载盗链,防图片盗链,可以伪装(比如迅雷).“本图片仅供**网内部交流使用“,在Dz中测试,全局防盗链用Globals.assx .效果:
Request.UserHostAddress获得访问者的IP地址,效果:
Request.UserLanguages获得访问者浏览器支持的语言,可以通过这个实现对不同语言的人显示不用语言的页面…返回的是以个string数组.效果:
Request.Cookies获取浏览器发过来的浏览器端得Cookie,从它里面读取Cookie值,比如context.Requset.Cookies[“mysessionid”];使用Request.Cookies的时候一般只是读取,将Cookie写回浏览器要用Response.Cookies。
Request.MapPath("~/Default.aspx")将虚拟路径转换为磁盘上的物理路径.效果:
Response对象
响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器.
Response对象的主要成员:
Response.Flush()将缓存区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用.案例:
新建一个一般处理程序.ashx。
context.Response.ContentType = "text/html";
for (int i = 0; i < 15; i++)
{
System.Threading.Thread.Sleep(500);
context.Response.Write("正在执行第"+i+"步<br/>");
context.Response.Flush();
}
Response.Clear()清空缓存区中的数据,这样在缓冲区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器.在用aspx输出非html的例子中经常看到用clear来输出Httpmodule等给附加的内容(不推荐,推荐用ashx)
Response.ContentEncoding输出流的编码.
Response.ContentType输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG).
Response.Cookies返回给浏览器的Cookie的集合,可以通过它设置Cookie.
Response.OutputStream输出流,在输出图片,Excel文件等非文本内容的时候要适用它.
Response.End()终止响应.将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行,在终止一些非法请求的时候,比如盗链等可以用end()立即终止请求.效果:
if (Request.UserHostAddress=="127.0.0.1")
{
Response.Write("自己不能看");
Response.End();
}
页面只显示“自己不能看“。
Response.Redirect(url)重定向浏览器到新的网址,既可以重定向到站外网址也可以重定向到站内网址.(2次请求)
Response.SetCookie(HttpCookiecookie)向输出流中更新写到浏览器中的Cookie,如果Cookie存在就更新不存在就增加,是对Response.cookie的简化调用.
Response.Write()向浏览器输出内容…
Response.WriteFile(filename)向浏览器输出文件.比如
Response.WriteFile(“c:/1.exe”);
Server对象
Server是context的一个属性,是HttpServerUtility类的一个对象.
Server.HtmlDecode().Server.HtmlEncode(),Server.UrlDecode()是对HttpUtility类中相应方法的的一个代理调用。个人推荐总是使用HttpUtility,因为有的地方很难拿到Server对象。别把HtmlEncode.UrlEncode混了,UrlEncode是处理超链接的,HtmlEncode是处理Html代码的。还是推荐用HttpUtility.HtmlEncode.
HttpUtility.UrlEncode("http://www.baidu.com/?name=你好");效果:
UrlEncode会把“/”和中文处理…
Server.Transfer(path)内部重定向请求,Server.Transfer(“abcd.aspx”)将用户的请求重定向给abcd.aspx处理,是服务器内部的接管(不能重定向到外部网站),浏览器是意识不到这个接管的,不是像Response.Redirect那样经历“通知浏览器”请重新访问URl这个网址”和浏览器接到命令访问新网址的过程”是一次http请求,因此浏览器地址栏不会变化(联想,10086告诉客户一个号码和帮客户转接的区别).因为是内部接管,所以在被重定向到的页面中是可以访问到Request,Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的.而Redirect则不行,因为是让浏览器去访问的,注意Transfer是内部接管,因此不能像redirect那样重定向到外部网站(常考)文章重定向.
使用Server.Transfer不能直接重定向到ashx,否则会报错”执行请求出错”。
有的时候不能拿到HttpContext对象,比如在Global.asax中.可以通过HttpContext.Current拿到当前的HttpContext,进而拿到Response,request,server等。Server.MaPath。如果拿不到Server则使用HostingEnvironment.MapPath()方法。
如果拿不到Context,可以用HttpContext.Current拿到当前的对象.
HttpHandler的无状态
一个浏览器发出的请求都是由实现了IhttpHandler接口的对象进行响应,由于下次访问不一定还是上次那个对象进行响应,上次响应完毕对象可能已经被销毁了.写的类变量值早就不存在了,因此不要将状态信息保存到类变量中.