Referer 是 HTTP
请求(requset) header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里就有包含 Referer 。
比如我在www.csdn.net
里点击一篇博客,那么点击这个博客,它的header信息里就有:
Referer=https://www.csdn.net/
如下图:request header有这么一行(从浏览器的开发者工具->NetWork->Header中看)
简单来说:Referer就是当前页面的上一页面
那么就可以根据Referer来判断你的页面是不是被盗取了,被另外一方的网站引用了。
小彩蛋:Referer是Referrer的错误拼写,但HTTP/1.0 协议
当时拼错了发现晚了,已经被大量使用,如果要改过来需要所有服务端、客户端的一致配合,还有大量的代码需要排查修改。于是,HTTP
的标准制定者们决定将错就错,不改了。到今日,搜索Referer这个单词,发现解释也是跟Referrer一样的解释了,广为流传变成正确的了。
举个例子:
一个正版网站:www.163.com
;其中有个页面是www.163.com/new.html
一个盗版网站:www.361.com
;其中有个页面是www.361.com/new361.html
而盗版网站的链接有的是偷取的正版网站的链接,据为己有,这时候如果设置了防盗链就会被拦截,转到服务器想让它到的地方。
如图:
HTTP
请求中根本不包含 Referer 。HTTP
请求会不包含 Referer 字段呢?Referer 代表的是上一个页面(请求地址),如果上一个请求地址是没有的,那么Referer 自然也是空的。
直接在浏览器的地址栏中输入一个资源的URL地址,这种方式的请求是不包含Referer的 ,这是一个“凭空产生”的 HTTP
请求,并不是从一个地方链接过去的。
情景模拟:(本例子在tomcat9环境下,低版本乱码请看本人另一篇博客解决:Servlet乱码解决)
1.在d盘建立一个文件夹shanzhai(名字随意),再建立一个ROOT文件夹(一定大写),再其中写一个山寨网页
2.山寨内容(注意我的tomcat端口是8081,默认8080)
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我是山寨网站www.361.comtitle>
head>
<body>
<h1>我是山寨网站www.361.comh1>
<hr />
<p>我是广告1p>
<a href="http://localhost:8081/RefererServlet">武汉加油!中国加油!a>
<p>我是广告2p>
body>
html>
3.给山寨网站取一个域名www.361.com,到tomcat目录下/conf/server.xml中Engine标签内添加
4.到C:\Windows\System32\drivers\etc中修改hosts文件,在其末尾添加(代表访问www.361.com还是在访问本机哦)
127.0.0.1 www.361.com
1.web项目添加Servlet:RefererServlet(这个就是防盗链的控制器)
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/RefererServlet")
public class RefererServlet extends HttpServlet {
private static final long serialVersionUID = 7883076061572095135L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//获取HTTP header中的Referer
String referer=request.getHeader("Referer");
//判断Referer是否符合标准:不允许直接URL访问;不允许除了前缀http://localhost:8081的其他页面访问
//我的tomcat的端口是8081,默认8080
if (referer==null || "".equals(referer)|| !referer.startsWith("http://localhost:8081")){
//不符合标准的送去官网
response.sendRedirect("QQnews.html");
return;//退出Servlet
}
//符合标准进入链接页面
request.getRequestDispatcher("chinaNO1.html").forward(request,response);
}
}
2.web项目添加正版网站页面和新闻内容页面
正版网站:腾讯新闻
<html lang="en">
<head>
<meta charset="UTF-8">
<title>腾讯新闻title>
head>
<body>
<h1>腾讯新闻h1>
<hr />
<p>我是广告1p>
<a href="RefererServlet">武汉加油!中国加油!a>
<p>我是广告2p>
body>
html>
中国加油页面
<html lang="en">
<head>
<meta charset="UTF-8">
<title>武汉加油!中国加油!title>
head>
<body>
<center>
<h1>武汉加油!中国加油!h1>
<hr />
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1586511481911&di=ef37659dc6514450199730b2668aa0e5&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200226%2F0f8382216d03487bb5aaf787e8ef8e51.jpeg" />
<p>武汉加油,中国加油!p>
<p>天佑中华,众志成城,共渡难关!<br />
风雨过后一定有彩虹!武汉加油!中国加油!灾难我们一起面对,一起承受!<br />
一定能打赢这场没有硝烟的战争!
p>
center>
body>
html>
1.打开盗版网站www.361.com:8081/ShanZhai.html (注意端口号和大写)
2.访问武汉加油,发现跳转到正版新闻主页了,防盗链判断无法通行,拦截并跳转,发挥作用!
3.在主页访问武汉加油,防盗链判断可以通行
Referer是Http Header中的一个字段,它代表是的上一次的请求链接,我们在Servlet控制器中可以对其进行判断,使用startsWith()方法限制Referer必须由本项目(域名)才能直接访问所属页面,其他请求将被跳转到你指定的页面。
Referer为空代表:直接URL输入网址请求资源或者重定向请求资源等等(等读者自行发掘哦)
Referer防盗链只能防止基础的偷取页面链接,并不是万能的,通过java可以伪造HTTP请求,继而仍能成功盗链。
本文参考:
javaweb之request获取referer请求头实现防盗链
ServletRequest实现的防盗链问题
什么是Referer?Referer的作用?空Referer是怎么回事?
如果对小伙伴们有所帮助,欢迎点赞评论支持作者的创作热情~