目录
ASP .NET运行机制
当请求发送至服务器IIS并被其接收后,IIS 服务器会判断请求文件的类型,如果是html、jpg、gif和txt等静态文件,IIS会自行根据目录找到文件并发送给客户端。如果是aspx页面的动态文件,则IIS会通过aspnet. _isapi.dll将请求转交给 ASP.NET运行时环境进行处理,最终的处理结果会返回给IIS,发送到客户端。在ASP.NET运行时,环境中的处理请求是通过一系列对象来完成的,包括HttpApplication、HttpModule和HttpHandler。通过使用HttpApplication对象来处理接收到的请求,HttpApplication 对象每次只能处理一个请求,这样其成员变量才可用于存储针对每个请求的数据,如Response对象和Request对象。
ASP .NET 处理请求的内部过程
HttpModule对象
HttpModule 是HTTP请求的“ 必经之路”, 它可以在该HTTP请求传递到最终的“请求处理中心(HttpHandler)”进行处理之前做一些额外工作, 或者在某些情况下终止满足一些条件的HTTP请求,从而起到一-个过滤器的作用。
HttpModule对象案例
在项目中创建TestHttpModule类,该类实现IHttpModule接口
public class TestHttpModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
//初始化,为HttpApplication对象绑定两事件
//在HttpHandler请求处理之前触发的事件
context.BeginRequest += context_BeginRequest;
//请求处理完毕触发的事件
context.EndRequest += context_EndRequest;
}
//请求处理前,附加信息
private void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
application.Response.Write("<p>HttpModule开始处理请求</p>");
}
//请求处理完毕后,附加信息
private void context_EndRequest(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
application.Response.Write("<p>HttpModule结束处理请求</p>");
}
}
在web.config中配置相关配置文件:
<system.webServer>
<modules>
<add name="test" type="WebApplication3.TestHttpModule" />
</modules>
</system.webServer>
最后创建web窗体(可以什么都不添加),页面效果:
HttpHandler对象
每个请求都可能经过多个HttpModule处理,然而最终的处理中心是HttpAandler。
HttpHandler对象 防盗链案例
演示防盗链,具体要求如下:
(1)创建一 个网站,网站下的Images文件夹中有ipg图片资源,本网站的页面引用图片的相对路径后可以正常显示。
(2)创建第二个网站,网站下有一个页面引用了上一个网站中的ipg图片资源,结果不能正常显示图片资源,而会显示一个表示错误的图片。
2)创建站点
(1)创建被盗链站点。按照上述要求,首先创建包含了image图片资源的网站,然后添加一个sapx页面,插入本网站提供的三幅图片,相关代码如下(CssClass="wh"是控制一下图片的宽高):
<asp:Image ID="Image1" CssClass="wh" runat="server" ImageUrl="~/images/4.jpg" />
<asp:Image ID="Image2" CssClass="wh" runat="server" ImageUrl="~/images/5.jpg" />
<asp:Image ID="Image3" CssClass="wh" runat="server" ImageUrl="~/images/6.jpg" />
(2)创建盗链站点。创建第二个网站,添加aspx页面,引用第一个网站提供的三张图片的网页路径,相关代码如下:
<div>
<asp:Image ID="Image1" CssClass="wh" runat="server" ImageUrl="https://localhost:44367/images/4.jpg" />
<asp:Image ID="Image2" CssClass="wh" runat="server" ImageUrl="https://localhost:44367/images/5.jpg" />
<asp:Image ID="Image3" CssClass="wh" runat="server" ImageUrl="https://localhost:44367/images/6.jpg" />
</div>
此时效果(第二给网站获取到了第一个网站的资源):
编写HttpHandler类
通过HttpHandler解决盗链问题,创建PreventLink类并实现IHttpHandler接口
public class PreventLink : IHttpHandler
{
public bool IsReusable => true;
public void ProcessRequest(HttpContext context)
{
//获取上次请求的URL
Uri lastUrl = context.Request.UrlReferrer;
//获取本次请求的URL
Uri currentUrl = context.Request.Url;
//判断是否为盗链(如果上次请求的URL和本次请求的URL不一致就为盗链)
if (lastUrl.Host != currentUrl.Host || lastUrl.Port != currentUrl.Port)
{
//获取“请勿盗链”警告提示图片路径
string errorlmagePath = context.Request.PhysicalApplicationPath + "images/7.jpg";
//发送至客户端
context.Response.WriteFile(errorlmagePath);
}
else
{
context.Response.WriteFile(context.Request.PhysicalPath);
}
}
}
在web.config中配置相关配置文件:
<system.webServer>
<handlers>
<add verb="*" path="images/*" type="WebApplication1.PreventLink" name="plink"/>
</handlers>
</system.webServer>
在Web。config中配置实现当请求images文件夹中所有图片时,由PreventLink类处理的功能,很多人在这里会出现问题,主要是type找不到PreventLink这个类和截取不到images文件夹中的图片。
最终效果:
如果最后一步有问题可以评论一起讨论