ASP.NET小札(二)--HttpContext(请求上下文对象)

ASP.NET小札(二)--HttpContext(请求上下文对象)

二、服务器如何获取浏览器提交的数据?
    1.获取POST数据:context.Request.Form[“txtname”]
     2.获取GET参数:context.Request.QueryString[“txtname1”]

三、服务器如何向浏览器输出数据?
  1. 服务器向浏览器输出文本内容:

    context.Response.ContentType = "text/plain";

    context.Response.Write(“我是从服务器输出到浏览器的数据!:)”);
    //Response 允许开发人员对当前页面的输出流进行操作
    //write:直接在页面上输出内容,将内容存在httpwriter中的char数组

 

   2.服务器向浏览器输出js代码:
    context.Response.ContentType = "text/html";
    context.Response.Write("<script>alert('格式错误');</script>");

  

  3.redirect:重定向到另外一个页面,服务其发送命令让浏览器跳转
   原理:服务器向浏览器发送一个包含302状态码和Location的响应报文,浏览器看到302后就会自动请求Location指定的页面。Response.Redirect(location);


   4.end:立即输出Response里保存的响应报文数据,并停止当前页面代码的执行。Response.End();

 

ASP.NET小札(二)--HttpContext(请求上下文对象)

 

四、关于表单提交数据:

   浏览器向服务器端提交数据,被提交数据的表单(input、select、textarea等)放到form中,form中通过action属性设定表单被提交给哪个页面,为了在服务端取出表单项的值,需要在HTML中为表单元素设定name属性,注意id是给JS操作Dom用的,name才是提交给服务器用的。在服务器端用context.Request["username"]来根据表单项的name来获得提交的属性值。通过context.Response.Write向浏览器输出处理后的显示HTML内容。

   当我们点击“提交”按钮以后是浏览器将用户填写的文本框等控件中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的这个页面。哪些标签的哪些值会被提交给服务器呢?将用户填写的内容提交到服务器有如下几个条件:

 
    1.只能为input、textarea、select三种类型的标签。只有input(文本框、CheckBox等)用户才可能填写值,<label>、<p>、<font>等标签仅供显示用,没有提交到服务器的必要。


   2.只有value属性的值才会提交给服务器。以input标签为例,input标签有title、type、disabled等属性,但是这些属性都是供显示用的,用户并不能修改,只有value属性才是用户输入的属性,因此只有value属性的值才会被提交到服务器。


   3.标签必须设定name属性。如果要通过JavaScript操作标签,必须为标签设定Id。如果要将标签的value属性值提交到服务器,则必须为标签设定name属性,提交到服务器的时候将会以“name=value”的键值对的方式提交给服务器,多个键值对之间用&分割。name是给服务器用的,id是给Dom用的。

   

   4.除了单选按钮等少数标签之外,大部分标签的name的值不能重复。如果两个Input文本框的name都为“txtN”,那么提交结果为txtN=123&txtN=768,在服务器取时:Request.Form["txtN"]= 123,678。

   对于RadioButton,同name的为一组,选中的RadioButton的value被提交到服务器。
   

   5.如果设置了控件的disabled属性或enabled=false的话,浏览器也不会提交该控件的值。如果只读(readonly=true),还是会被提交。

   6.只有放到form标签内的标签才可能会被提交到服务器,form之外的input等标签被忽略。

 

注意:1.易犯错误:string 转 int 时,不能使用(int)强转,必须使用对应的转换方法如
int.Parse,int.TryParse,Conver.ToInt32
      2.服务器不允许使用post方式请求静态页面(因为静态页面不能接收浏览器传递(post)过来的数据)。

五、get和post的区别:

   get是通过url传递表单值,post通过url看不到表单域的值;

   get传递的数据量是有限的,如果要传递大数据量不能用get,比如type=“file”上传文章、type=“password”传递密码或者<textarea>发表大段文章,post则没有这个限制;

   post会有浏览器提示重新提交表单的问题,get则没有。

   对于Post的表单重新敲地址栏再刷新就不会提示重新提交了,因为重新敲地址就没有偷偷提交的数据了。   

   Post方式的正确的地址很难直接发给别人。Get方式URL数据格式。服务端文件名后跟着“?”,由于客户端可能向服务器端提交多个键值对,键值对之间用“&”进行分割,如果URL中有汉字、特殊符号等,则需要对URL进行编码。

六、Request其它成员
1、Request.UrlReferrer请求的来源,可以根据这个判断从百度搜的哪个关键词、防下载盗链、防图片盗链,可以伪造。

   扩展--图片盗链:

   服务器B的输出给浏览器的页面中包含服务器A的图片。这样对于浏览器用户来说,只知道访问了服务器B的页面,但不知道图片是从服务器A输出的。所以服务器A要防止别的服务器访问它的图片等其它资源。

   在处理程序映射上增加图片后缀的映射,把它交给对应的动态页面去判断,这样,IIS就不会直接处理图片,而是交由FrameWork处理.在文件通过请求管道时,因为设了Global.asax配置文件把关。

 public class Global :System.Web.HttpApplication
    {
/// <summary>
/// 使用事件自动注册机制,此方法会自动注册到 HttpApplication请求管道的第一个事件上
/// </summary>
protected void Application_BeginRequest(object sender, EventArgse)
{
HttpApplication application = sender as HttpApplication;
HttpRequest request = application.Context.Request;
HttpResponse response = application.Context.Response;
//防止盗链
if (request.RawUrl.Contains(".png"))
{
//如果请求的来源 不是 图片所在的网站,则判断为盗链行为
if (request.UrlReferrer.Port!= 19449)
{
response.ContentType = "image/jpeg";
using (Image img = new Bitmap(500, 200))//创建图片
{
using (Graphics g = Graphics.FromImage(img))//在图片上创建画笔
{
g.DrawString("这是图片盗链",new Foont("宋体",22),Brushes.White,2,2);

                                  

img.Save(response.OutputStream,System.Drawing.Imaging.ImageFormat.Jpeg);//将图片保存在指定的流中
}
response.End();
}

2、Request.UserHostAddress获得访问者的IP地址,通过Socket获得的。

 

3、Request.MapPath(virtulPath)将虚拟路径转换为磁盘上的物理路径,Request.MapPath("./a/b.aspx")就会得到D:\2008\WebSites\WebSite4\a\b.aspx(Server.MapPath里就是调用的Request.MapPath)

 

4、 (*)Request.AppRelativeCurrentExecutionFilePath,获取当前执行请求相对于应用根目录的虚拟路径,以~开头,比如“~/Handler.ashx”


5、 (*) Request.PhysicalApplicationPath,获取当前应用的物理路径,比如D:\我的文档\VisualStudio 2008\WebSites\WebSite4\


6、 (*) Request.PhysicalPath,获取当前请求的物理路径,比如D:\我的文档\Visual Studio2008\WebSites\WebSite4\Handler.ashx


7、 (*)Request.RawUrl获得原始请求URL、Request.Url获得请求的URL,区别涉及到URL重写的问题


8、 (*)Request.UserLanguages获得访问者浏览器支持的语言,可以通过这个实现对不同语言的人显示不同语言的页面。

 

七、Response其它成员
   响应的缓冲输出:为了提高服务器的性能,ASP.Net向浏览器Write的时候默认并不会每Write一次都会立即输出到浏览器,而是会缓存数据,到合适的时机或者响应结束才会将缓冲区中的数据一起发送到浏览器。
   Response对象的主要成员:


1、Response.Buffer、Response.BufferOutput:两个属性一样,Buffer内部就是调用的BufferOutput。这个属性用来控制是否采用响应缓存,默认是true。


2、Response.Flush()将缓冲区中的数据发送给浏览器。这在需要将Write出来的内容立即输出到浏览器的场合非常适用。案例:大批量数据的导入,显示正在导入第*条数据,用Thread.Sleep模拟耗时。

3、Response.Clear()清空缓存区中的数据,这样在缓存区中的没有发送到浏览器端的数据被清空,不会被发送到浏览器。


4、Response.ContentEncoding输出流的编码。


5、Response.ContentType输出流的内容类型,比如是html(text/html)还是普通文本(text/plain)还是JPEG图片(image/JPEG)。


6、Response.OutputStream 输出流,在输出图片、Excel文件等非文本内容的时候要使用它

7、Response.End() 终止响应,将之前缓存中的数据发给浏览器,End()之后的代码不会被继续执行,End方法里调用了Flush()方法。在终止一些非法请求的时候,比如盗链等可以用End()立即终止请求。

八、Server属性
   Server是上下文对象context的一个属性,是HttpServerUtility类的一个对象,它提供对服务器上的方法和属性的访问。

   常用方法:
1、MapPath方法:取得文件的物理路径

2、Transfer:第一个页面直接调用第二个页面,执行完第二个页面后不再返回第一个页面,立即响应到客户端浏览器。

   Server.Transfer(path)内部重定向请求,Server.Transfer(“JieBanRen.aspx”)将用户的请求重定向给JieBanRen.aspx处理,是服务器内部的接管(不能重定向到外部网站),浏览器是意识不到这个接管的,不是象Response.Redirect那样经历通知浏览器“请重新访问url这个网址”和浏览器接到命令访问新网址的过程,是一次http请求,因此浏览器地址栏不会变化。

   因为是内部接管,所以在被重定向到的页面中是可以访问到Request、Cookies等这些来源页面接受的参数的,就像这些参数是传递给他的,而Redirect则不行,因为是让浏览器去访问的。

   注意Transfer是内部接管,因此不能像Redirect那样重定向到外部网站。Response.Redirect就可以重定向到外部网站,但不能内部重定向到ashx,否则会报错“执行子请求出错”。


3、Execute:第一个页面直接调用第二个页面,执行完第二个页面后再返回第一个页面执行,最后响应到客户端浏览器。

4、HtmlEncode()&HtmlDecode():将文本编码成可以在浏览器中可正确浏览的格式

5、UrlEncode()&&UrlDecode():URL编码和解码
*HtmlEncode和UrlEncode的区别:UrlEncode是处理超链接中的中文问题,HtmlEncode是处理html代码的

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值