在做一个社交网站时发现,在页面html中通过 直接引用网络资源时,部分图片无法显示。

发现:这些无法显示的资源,是在服务器端做了referer禁用处理,这样就只能把资源下载到自己的服务器使用了。

referer禁用:客户端在向服务器请求时,会通过"referer" 属性传递发起请求的域名,要是与资源域名不能匹配就不允许访问。

为此,本虾米写了一个伪造referer的小应用,用于获取网络资源,并保存到自己的服务器。

不再赘述了,直接上代码:

/* fileUrl网络资源地址 */

public static boolean saveUrlAs(String fileUrl, String savePath){

        try {

            /* 将网络资源地址传给,即赋值给url */

            URL url = new URL(fileUrl);

            

            /*获取资源路径的主域名*/

            String refererUrl = getRefererUrl2(fileUrl);

            /* 此为联系获得网络资源的固定格式用法,以便后面的in变量获得url截取网络资源的输入流 */

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon;)");

            connection.setRequestProperty("Accept-Encoding", "gzip");

            /*伪造referer资源信息*/

            connection.setRequestProperty("referer", refererUrl);

            connection.setRequestProperty("cookie", refererUrl);

            DataInputStream in = new DataInputStream(connection.getInputStream());

             

            /* 此处也可用BufferedInputStream与BufferedOutputStream  需要保存的路径*/

            DataOutputStream out = new DataOutputStream(new FileOutputStream(savePath));

             

             

            /* 将参数savePath,即将截取的图片的存储在本地地址赋值给out输出流所指定的地址 */

            byte[] buffer = new byte[1024];

            int count = 0;

            while ((count = in.read(buffer)) > 0)

            {

                out.write(buffer, 0, count);

            }

            out.close();

            in.close();

            connection.disconnect();

            return true;

 

        } catch (Exception e) {

            System.out.println(e + fileUrl + savePath);

            return false;

        }

    }


/**

* 根据资源路径截取资源的域名信息

* @param url

* @return

*/

public static String getRefererUrl2(String url){

String result = "";  


Pattern p = Pattern.compile("http://((\\w)+\\.)+\\w+");


Matcher m = p.matcher(url);  


if(m.find()){  

result = m.group();

}

return result;

}


public static void main(String[] args) {

    String photoUrl = "http://pic2.zhimg.com/1e9e403b7b871ecc5a9f783df550f5da_b.jpg";

    String fileName = photoUrl.substring(photoUrl.lastIndexOf("/"));

    String filePath = "d:/photosFile";

    saveUrlAs(photoUrl, filePath+fileName);

}