防盗链解决办法

501 阅读1分钟
业务需求:使用富文本编辑器在复制其他网站文章时候,网络资源(图片等)加载失败,403。
解决问题:网络资源在添加防盗链时,会限制非白名单网站访问。
防盗链原理:防盗链功能基于HTTP协议支持的Referer机制,通过Referer跟踪来源,对来源进行识别和判断。
解决原理:在 html 添加 meta标签

快速的解决方法就是在html添加

<meta name="referrer" content="no-referrer" />

业务要求:仅限在富文本预览页面添加meta标签不要影响其他页面。

方案:动态添加meta标签

useEffect(() => {
  //添加meta标签
  let meta_new = document.createElement("META");
  let name = document.createAttribute("name");
  let content = document.createAttribute("content");
  name.value = "referrer";
  content.value = "no-referrer";
  meta_new.setAttributeNode(name);
  meta_new.setAttributeNode(content);
  document.getElementsByTagName("head")[0].appendChild(meta_new);


  return () => {
    // 移除meta标签
    let metas = document.getElementsByTagName("meta");
    for (var i = 0; i < metas.length; i++) {
      if (
        metas[i].getAttributeNode("name") != null &&
        metas[i].getAttributeNode("name")?.value == "referrer" &&
        metas[i].getAttributeNode("content") != null &&
        metas[i].getAttributeNode("content")?.value == "no-referrer"
      ) {
        document.getElementsByTagName("head")[0]?.removeChild(metas[i]);
      }
    }
  };
}, []);

PDF无法预览

当然部分网络PDF文件也有有这样的问题。利用window.open来打开PDF发现添加了防盗链,无法打开,下面给大家介绍另种打开的方法:主要是添加参数noreferrer

window.open(url, "_blank", "noreferrer");

//防盗链 Referer 的限制 主要是添加参数noreferrer
export function crackOpen(url, newWindow) {
  //newWindow 是否打开新的窗口  `resizable打开新的浏览器窗口`
  if (typeof url != 'string') return
  window.open(url, "_blank", `noreferrer,${newWindow ? 'resizable' : ""}`);
}