Friday, October 15, 2004

 

Some notes on file download

1.
作者:gdsean
出处:http://www.csdn.net/develop/read_article.asp?id=15653

页面重定向一般有两个页面,第一个页面是引导页,利用meta标签的HTTP-EQUIV=REFRESH重新获得新的页面地址。所以可以用一个页面标签解释的办法来取得新的页面地址。

我们采用一个正则表达式:

String express = "HTTP-EQUIV\\s*=\\s*\"*REFRESH\"*([^>]*)URL\\s*=\\s*([^>]*)>";

来匹配引导页。如果匹配到有定向标签的就取得标签中的url,处理相对地址变为绝对地址,然后再下载这个地址的页面,这个过程可以迭代,直到没有匹配到定向标签,最后下载到的页面为最终页面。

Java例子代码:

[code]
private boolean tryRedirect(StringBuffer sb){

String text = sb.toString();//取得页面正文

if(matcher.contains(text,pattern)){//如果匹配表达式成功

MatchResult result = matcher.getMatch();

String url = result.group(2);//取得标签里面的新地址

url = url.trim();

if(url.charAt(url.length()-1)=='\'){

url = url.substring(0,url.length()-1);

}

if(url.charAt(url.length()-1)=='\"'){

url = url.substring(0,url.length()-1);

}

//转换相对地址为绝对地址

currentURL=com.westwind.infogate.util.URLProcess.RelativelyToFull(url,currentURL);

if(currentURL==null)

return false;

currentURL = URLProcess.addHttphead(currentURL);

return true;

}

return false;

}
[/code]

(按:有些东西,不知道就是一点也不明白。而其实原理很简单。用到的时候再学吧!)

2.
C#下的类似方法
作者:纯朴的狗熊
出处:http://blog.joycode.com/liuhuimiao/posts/18180.aspx

1) 首先创建一个类库项目ClassLibrary
[code]
using System;
using System.Web; // 引用System.Web组件
namespace ClassLibrary1
{
public class MyHandler : IHttpHandler
{
public MyHandler()
{
}
#region IHttpHandler 成员
public void ProcessRequest(HttpContext context)
{
// 跳转到WebForm1.aspx,由WebForm1.aspx输出rar文件
HttpResponse response = context.Response;
response.Redirect("http://193.100.100.56/TestWebSolution/WebApplication1/WebForm1.aspx");
}

public bool IsReusable
{
get
{
// TODO: 添加 MyHandler.IsReusable getter 实现
return true;
}
}
#endregion
}
}
[/code]

2) 创建测试用的Web项目WebApplication。在配置文件Web.config文件节点里增加如下节点:



httpHandlers>

3) 在WebForm.aspx里增加一个文本为“下载”的Button,其Click事件如下(点这里查看):

[code]
FileInfo file = new System.IO.FileInfo(@"G:\WebCenter\TestWebSolution\WebApplication1\test.rar");

// FileInfo 类在 System.IO 命名空间里
Response.Clear();
Response.AddHeader("Content-Disposition", "filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
string fileExtension = file.Extension;

// 根据文件后缀指定文件的Mime类型
switch (fileExtension)
{
case ".mp3":
Response.ContentType = "audio/mpeg3";
break;
case "mpeg":
Response.ContentType = "video/mpeg";
break;
case "jpg":
Response.ContentType = "image/jpeg";
break;
case "........等等":
Response.ContentType = "....";
break;
default:
Response.ContentType = "application/octet-stream";
break;
}
Response.WriteFile(file.FullName);
Response.End();
}
[/code]

4) 最后一步就是在IIS里增加一个应用程序扩展。在“默认网站”->“属性”->“主目录”->“配置”。在弹出的“应用程序配置”窗口里按“添加”,在弹出的“添加/编辑应用程序扩展名映射”窗口里“可执行文件”选择C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll,在扩展名里输入“.rar”,然后确定即可。

5) 在IE里输入http://193.100.100.56/TestWebSolution/WebApplication1/test.rar,会立即跳转到http://193.100.100.56/TestWebSolution/WebApplication1/WebForm1.aspx,然后按WebForm1.aspx的“下载”按钮就可以下载test.rar了。

6) 当然,这里只按例子给个思路,完全可以再根据自身情况扩展。下面有几个参考的资源文章:
http://www.9seek.com/news/show.aspx?id=745&cid=12
http://www.9seek.com/news/show.aspx?id=521&cid=12
http://www.9seek.com/news/show.aspx?id=520&cid=12
http://msdn.microsoft.com/asp.net/using/building/web/default.aspx?pull=/library/en-us/dnaspp/html/URLRewriting.asp

3.
对每个 IP 访问量实时监控
By 蝈蝈俊
From http://blog.joycode.com/ghj/posts/26447.aspx

一些下载网站内容的机器人程序,写得很不好,会疯狂的刷比较耗时的页面,这会对正常用户的访问带来很大的麻烦。避免这个问题,就需要实时对用户访问量进行监控。


以前自己用VC++6.0写了个ISAPI filter .就是做实时限制,实时封杀IP功能的。

当时是参照下面的文章写的:
http://www.codeguru.com/Cpp/I-N/isapi/filters/article.php/c1303

(按:作者提供的代码大意如下
以下内容为程序代码:


EXPORTS
HttpFilterProc
GetFilterVersion

// 每个ip的信息记录类
class CIpInfo
{
public:
CIpInfo();
virtual ~CIpInfo();

// ip地址
long m_cIPAddress; // ip address

// ip计数,如果是当前访问记录中用,是这个ip一定时间内访问次数
// 如果用在封杀记录中,是还要被封杀时间的记录,这个记录是单位时间的倍数
int m_idegree;

};




然后是核心部分

以下内容为程序代码:

// CSDNIPPOLICY.H - Header file for your Internet Server
// CsdnIpPolicy

// The html page showing access denied.
#define NO_ACCESS "NoAccess.htm"

//#define INITIALIZE_FILE "C:\\TEMP\\csdnippolicy.xml"
//日志文件保存目录
#define LOG_PATH "LOG\\"

//配置文件
#define INI_FILE "CSDNIPPOLICY.INI"
// 多长间隔处理一次;
#define TIMELIMIT 3*60*1000

#include "resource.h"
#include "IpInfo.h"



typedef deque IP_LIST;


class CCsdnIpPolicy : public CHttpFilter
{
protected:
VOID TerminateCache();
static BOOL TimeSwitch();
BOOL Initialize();
static BOOL ValidateIPAddress(const long pszIPAddress, OUT BOOL* pfValid);
// 记录访问ip列表
static IP_LIST m_request_ip_list;
// 记录被限制ip列表
static IP_LIST m_force_out_ip_list;
// 不通过这个限制的ip
static IP_LIST m_free_ip_list;
// 缓存保护锁
// 保护 m_force_out_ip_list 的锁
static CRITICAL_SECTION m_force_out_CacheLock;
// 保护 m_request_ip_list 的锁
static CRITICAL_SECTION m_request_CacheLock;
//前一个时间的锁
static CRITICAL_SECTION m_pre_time_CacheLock;
static DWORD m_pre_time;
static CString m_Curr_Path;
public:
static BOOL AddIPAddressToRequestList(const long pszIPAddress);
CCsdnIpPolicy();
~CCsdnIpPolicy();

// Overrides
// ClassWizard generated virtual function overrides
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//{{AFX_VIRTUAL(CCsdnIpPolicy)
public:
virtual BOOL GetFilterVersion(PHTTP_FILTER_VERSION pVer);
virtual DWORD OnUrlMap(CHttpFilterContext* pCtxt, PHTTP_FILTER_URL_MAP pMapInfo);
//}}AFX_VIRTUAL

//{{AFX_MSG(CCsdnIpPolicy)
//}}AFX_MSG
};



在ASP.net中, 是可以写一个 httpModules 程序来实现实时监控。原因看下图说明的asp.net执行机制。

其实 asp.net 中的 Session 等都是用这个机制实现的。具体可以看你本机的 machine.config 文件。

这种方式下的代码在:
http://www.ghj1976.net/OpenSource/Project/IPPolicy/Code/IpPolicy.rar

需要注意的地方:

第一:基于 httpModules 的这个程序,只对
ASP.net 系列的文件(比如 *.aspx *.asmx)有效。也就是由 aspnet_isapi.dll? 来解析的文件。
对 *.html *.asp *.jpg 等这些文件无效。
要想对这些文件有效,请用前一个 ISAPI filter 程序。

第二:基于 httpModules 的这个程序,在一个站点有多个虚拟目录的情况下,各个虚拟目录都是一个独立的运算单元,相关之间没有关系。各个虚拟目录的实时记录都是不通用的。



<< Home

This page is powered by Blogger. Isn't yours?