客户使用从我的服务器安装脚本(javascript)的服务。我通过脚本将一个跟踪像素插入页面,该脚本可以获取点击信息。
当asp.net服务器拦截pixel.aspx时,它会将伪图像的查询字符串中的登录信息插入数据库并返回pixel.gif ...这一切都完美无缺(见下文)。
Imports Microsoft.VisualBasic
Imports System.Web
Public Class HelloWorldModule
Implements IHttpModule
Private pattern As String = "/images/(?<key>.*)\.aspx"
Private logoFile As String = "~/images/pixel.gif"
Public Sub New()
End Sub
Public ReadOnly Property ModuleName() As String
Get
Return "HelloWorldModule"
End Get
End Property
' In the Init function, register for HttpApplication
' events by adding your handlers.
Public Sub Init(ByVal application As HttpApplication) Implements IHttpModule.Init
AddHandler application.BeginRequest, AddressOf GetImage_BeginRequest
End Sub
Public Sub GetImage_BeginRequest(ByVal sender As Object, ByVal args As System.EventArgs)
'cast the sender to a HttpApplication object
Dim application As System.Web.HttpApplication = CType(sender, System.Web.HttpApplication)
Dim url As String = application.Request.Path 'get the url path
'create the regex to match for becon images
Dim r As New Regex(pattern, RegexOptions.Compiled Or RegexOptions.IgnoreCase)
If r.IsMatch(url) Then
Dim mc As MatchCollection = r.Matches(url)
If Not (mc Is Nothing) And mc.Count > 0 Then
Dim key As String = mc(0).Groups("key").Value
'SaveToDB(key)
End If
'now send the image to the client
application.Response.ContentType = "image/gif"
application.Response.WriteFile(application.Request.MapPath(logoFile))
application.Response.End()
End If
End Sub 'GetImage_BeginRequest
如果运行此脚本的客户端有一个已过期的帐户,我想在响应中返回error.gif(而不是pixel.gif),然后我需要检测error.gif src所以我可以通知客户端该服务已过期。
我尝试了以下操作,但它返回了图像的原始src。如何检测图像的更新src?
任何帮助或建议都将不胜感激。
testImage("images/pixel.aspx?login=123&country=canada", function (url, result) { if (result === 'success') { console.log(url) } }, 10000);
function testImage(url, callback, timeout) {
timeout = timeout || 5000;
var timedOut = false, timer;
var img = new Image();
img.onerror = img.onabort = function () {
if (!timedOut) {
clearTimeout(timer);
callback(url, "error");
}
};
img.onload = function () {
if (!timedOut) {
clearTimeout(timer);
callback(url, "success");
console.log(checkURL(url))
}
};
img.src = url;
document.body.appendChild(img);
timer = setTimeout(function () {
timedOut = true;
callback(url, "timeout");
}, timeout);
}
function checkURL(url) {
return (url.match(/\.(jpeg|jpg|gif|png)$/) != null);
}
答案 0 :(得分:0)
由于服务器在页面呈现之前发送pixel.gif,因此没有找到可以识别图像src的内容,因此没有脚本可以检测到src更改。我把逻辑放在服务器上,以便当客户帐户过期时,我现在在请求网页上显示一条消息到期...
' In the Init function, register for HttpApplication
' events by adding your handlers.
Public Sub Init(ByVal application As HttpApplication) Implements IHttpModule.Init
If acct_expired = False Then
AddHandler application.BeginRequest, AddressOf GetImage_BeginRequest
Else
AddHandler application.BeginRequest, AddressOf Application_BeginRequest ' GetImage_BeginRequest
End If
End Sub
Public Sub GetImage_BeginRequest(ByVal sender As Object, ByVal args As System.EventArgs)
'cast the sender to a HttpApplication object
Dim application As System.Web.HttpApplication = CType(sender, System.Web.HttpApplication)
Dim url As String = application.Request.Path 'get the url path
'create the regex to match for becon images
Dim r As New Regex(pattern, RegexOptions.Compiled Or RegexOptions.IgnoreCase)
If r.IsMatch(url) Then
Dim mc As MatchCollection = r.Matches(url)
If Not (mc Is Nothing) And mc.Count > 0 Then
Dim key As String = mc(0).Groups("key").Value
'SaveToDB(key)
End If
'now send the image to the client
application.Response.ContentType = "image/gif"
application.Response.WriteFile(application.Request.MapPath(logoFile))
application.Response.End()
End If
End Sub 'GetImage_BeginRequest
Private Sub Application_BeginRequest(ByVal source As Object, _
ByVal e As EventArgs)
' Create HttpApplication and HttpContext objects to access
' request and response properties.
Dim application As HttpApplication = DirectCast(source, HttpApplication)
Dim context As HttpContext = application.Context
Dim filePath As String = context.Request.FilePath
Dim fileExtension As String = VirtualPathUtility.GetExtension(filePath)
context.Response.Write("<hr><h1><font color=red>Your account has expired. Upgrade Today!</font></h1>")
End Sub