HttpHandler对象实现防盗链
今天我们学习HttpHandler当盗链
防盗链技术是Web项目开放过程中必定会用到的技术,
防盗链技术是为了一些人盗取你们的东西 如(图片)
现在我们开始学习演示如何做到放盗链
创建一个Web窗体在Web窗体里面加入加入几张图片
在Web窗体中创建文件夹以储存图片
如图、代码:
<form id="form1" runat="server">
<div>
<img src="image/奥特曼.jpg" />
<img src="image/二维码.jpg" />
</div>
</form>
现在我们需要在创建第二个Web窗体、并且在第二个窗体里面进行
引用第一个窗体的图片如图:
注:记住第二个窗体图片来自第一个窗体的图片资源
<form id="form1" runat="server">
<div>
<img src="https://localhost:44384/image/奥特曼.jpg" />
<img src="https://localhost:44384/image/二维码.jpg" />
</div>
</form>
当我们第二个窗体弄完后我们讲在第一个窗体里面进行创建MyHandler得类、并在在类中与IHttpHandler显示接口,并实现代码的编写
如代码:
public class MyHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
//获得上次请求的UrL
Uri lastUrl = context.Request.UrlReferrer;
//获得本次请求的URL
Uri currentUrl = context.Request.Url;
//判断是否为链盗
if (lastUrl.Host != currentUrl.Host || lastUrl.Port !=currentUrl.Port)
{
//获得“请勿盗链”警告提示图片路径
string errorlmagePath = context.Request.PhysicalApplicationPath + "image/蜡笔小新.jpg";
//发送至客户端
context.Response.WriteFile(errorlmagePath);
}
else
{
context.Response.WriteFile(context.Request.PhysicalPath);
}
}
}
现在我们还有最后一步,在配置相关配置文件里面编写代码
而跟我们盗链相关被配的文件是:Web.config(第一个窗体里面的)
在里面写如下代码:
<system.webServer>
<handlers>
<add verb="*" path="image/*.jpg" type="FivetaskTwo.MyHandler" name="x1"/>
</handlers>
</system.webServer>
如果都写完了你就可以运行程序了
如图:
EF水印的添加
现在我们将进行EF水印的操作
现在我们需要创建一个新的Web窗体创建一个项目、并且在窗体里面创建两个类
第一个为:MyModule
第二个为:MyHandler
我们还要在Web窗体里面创建一个文件夹用来存储我们所用的图片
如图:
当你现在把这些弄完之后我们就要进行第二步
在类里面编写代码
现在我们需要在MyHandler里面编写代码
首先我们MyHandler要实现接口 与 实现 “IHttpHandler”
如下:
public class MyHandler : IHttpHandler,IRequiresSessionState
{
public bool IsReusable => false;
public void ProcessRequest(HttpContext context)
{
string filename = context.Request.PhysicalPath;
//创建一个画板,把获取到的图片放到画板上
Bitmap bitmap = new Bitmap(filename);
//创建画笔,准备在画板是绘画
Graphics graphics = Graphics.FromImage(bitmap);
//水印图片放置的位置,用画板的宽高减去水印图片的宽高看水印图片位置是否合适不合适自己调节
graphics.DrawString("跟我比个✌", new Font("微软雅黑", 18, FontStyle.Bold), Brushes.Red, new Point(100, 100));
//清除画笔
graphics.Flush();
//将图片存为输出流
bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
}
现在我们还需要编写MyModule里面编写代码
且我们在编写MyModule也要实现接口 接口为: IHttpModule
如下;
public class MyModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.BeginRequest += Context_BeginRequest;
context.EndRequest += Context_EndRequest;
}
private void Context_BeginRequest(object sender, EventArgs e)
{
HttpApplication context = sender as HttpApplication;
string url = context.Request.Url.ToString();
//这个IF代码不完整可要可不要、不影响结果
//if (url.LastIndexOf(".jpg")==-1)
context.Response.Write("Context_BeginRequest");
}
private void Context_EndRequest(object sender, EventArgs e)
{
HttpApplication context = sender as HttpApplication;
context.Response.Write("Context_EndRequest");
}
}
现在我们在两个类里面编写完之后、我们要在Web窗体的项目里面插入一张图片 如下代码:
<form id="form1" runat="server">
<div>
<img src="img/奥特曼.jpg" />
</div>
</form>
当这些我们昨晚之后我们还有最后一步、我们需要在Web窗体的
配置相关配置里面编写一行我们所需的代码
相关配置是:Web.config
现在我们需要在这里面编写代码
如下:
<system.webServer>
<modules>
<add name="y1" type="FiveTask.MyModule" />
</modules>
<handlers>
//name =“自定义命名” path = “你的文件夹名加所以(*)”
<add verb="*" path="img/*" type="FiveTask.MyHandler" name="x1"/>
</handlers>
</system.webServer>
当你这些全部完整那么你的水印也就完成了、让我们现在看看效果
如下图:
这两个项目、你学会了吗?