防盗链的原理:

    在http 协议中,如果从一个网页跳到另一个网页,http 头字段里面会带个 Referer。图片服务器通过检测 Referer 是否来自规定域名,来进行防盗链。如果盗用网站是 https 的 protocol,而图片链接是 http 的话,则从 https 向 http 发起的请求会因为安全性的规定,而不带 referer,从而实现防盗链的绕过。

    那如何处理已有文章的图片被防盗链呢?

    我刚开始尝试了很多方法,如使用js或使用修改html等,还尝试了后台下载所有图片,存至服务器,然而由于服务器内存太小无法装下,只能放弃这种方法。

    于是我先制作了一个服务专门用于获取图片,然后将文章中的图片用正则全部找出来,进行替换。如(https://home.zcyoung.cn/iserver?path=http://zcyoung.cn/zb_users/upload/2016/04/201604061459949319230650.png

    正则代码:

public static String calImgSrc(String htmlStr) {  
  String img = "";  
  Pattern p_image;  
  Matcher m_image;  
  Set<String> pics = new HashSet<String>();  
  String regEx_img = "<img.*src\\s*=\\s*(.*?)[^>]*?>";  
  p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);  
  m_image = p_image.matcher(htmlStr);  
  while (m_image.find()) {  
   img = img + "," + m_image.group();  
   Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img);  
   while (m.find()) {  
    pics.add(m.group(1));  
   }  
  }  
  for(String imgs : pics){
   htmlStr = htmlStr.replace(imgs, "/iserver?path=" + imgs);
  }
  return htmlStr;  
 }

java服务端代码

public void get(HttpServletResponse response, String path){
  try{
   if(path != null && !path.equals("") && !path.startsWith("http")){
    path = "http:" + path;
   }
   URL url = new URL(path);    
   HttpURLConnection conn = (HttpURLConnection)url.openConnection();    
   conn.setConnectTimeout(3*1000);  
   conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
   InputStream inputStream = conn.getInputStream();    
   byte[] buffer = new byte[1024];    
   int len = 0;    
   ByteArrayOutputStream bos = new ByteArrayOutputStream();    
   while((len = inputStream.read(buffer)) != -1) {    
    bos.write(buffer, 0, len);    
   }    
   bos.close();
   byte[] getData = bos.toByteArray();
   if(inputStream!=null){  
    inputStream.close();  
   }  
      response.setContentType("image/png");  
      OutputStream os = response.getOutputStream();  
      os.write(getData);
      os.flush();    
      os.close();
  }catch(Exception e){
   
  }
 }

 

你可能感兴趣的文章

评论区

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

您好,欢迎到访网站!
  查看权限

«   2018年1月   »
1234567
891011121314
15161718192021
22232425262728
293031

最新留言