今天在一次会议中,有朋友问我,如何避免资源被迅雷等工具多线程下载?
确实,一些中小企业站点,尤其是个人站点,由于没有过多资金,服务器承受不了大的压力,站点提供的资源,一旦被迅雷等多线程工具下载,
对服务器的压力还是蛮客观的。
那么有什么办法避免多线程下载呢?其实最简单的办法,就是服务端根本就不要提供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值,那么就可以有效避免多线程下载了。