今天在一次會議中,有朋友問我,如何避免資源被迅雷等工具多線程下載?
確實,一些中小企業站點,尤其是個人站點,由于沒有過多資金,服務器承受不了大的壓力,站點提供的資源,一旦被迅雷等多線程工具下載,
對服務器的壓力還是蠻客觀的。
那么有什么辦法避免多線程下載呢?其實最簡單的辦法,就是服務端根本就不要提供Content-Length值。試想一下,如果多線程下載工具得不到文件總大小值,如何分配去分配每個線程需要下載的量呢?不得已,只能通過單線程下載了。
以http下載為例,我寫了一個提供下載的servlet,由于不返回Content-Length值(只返回了
ContentType值),這個serlvet返回的流,只能單線程下載。
public class Download extends HttpServlet {
private static final long serialVersionUID = 8401962046132204450L;
private static final String FILE_PATH = "/home/jones/tmp/sample.zip";
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/octet-stream");
OutputStream out = resp.getOutputStream();
FileInputStream in = new FileInputStream(FILE_PATH);
int readLength = 0;
byte[] cache = new byte[1024];
while ((readLength = in.read(cache)) != -1) {
out.write(cache, 0, readLength);
}
in.close();
out.flush();
out.close();
}
}
同樣的道理,只要配置服務器不要返回Content-Length值,那么就可以有效避免多線程下載了。