浏览器向服务器发送请求,可能是直接在浏览器地址栏中输入URL地址进行访问,也可能是点击一个网页上的超链接而发出。对于第一种情况,浏览器不会发送Referer请求头,而对于第二种情况,浏览器会使用Referer请求头字段来标识请求的超链接所在网页的URL。如下所示:
Referer: http://localhost:8080/Example07/
所谓的防盗链其实是Referer请求头的一个很重要的功能,在防盗链及Content-Type解读文档中,对于什么是防盗链有了详细的解释。今天,我们要学习的是如何通过request对象的相关方法实现防盗链功能。
1.防盗链案例练习
下面的防盗链练习是在Servlet中判断请求的来源,即referer请求头的值是否包含”localhost”,如果不包含或referer的值为null,则重定向到百度首页,否则在控制台上打印“hello“。具体如下所示:
(1)创建一个web应用,Example08,在该应用下创建一个Servlet类,RefererServlet,主要代码如例1-1所示:
例1-1 RefererServlet.java
public class RefererServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 使用Referer请求头,来防盗链
*/
String referer = request.getHeader("Referer");
System.out.println(referer);
if(referer == null || !referer.contains("localhost")) {
response.sendRedirect("http://www.baidu.com");
} else {
System.out.println("hello!");
}
}
}
(2)RefererServlet在web.xml文件中,其访问路径的配置为:“/RefererServlet”。
(3)将Example08发布到Tomcat服务器中,然后启动Tomcat服务器,在浏览器地址栏上输入:http://localhost:8080/Example08/RefererServlet,效果如图1-1所示:
访问RefererServlet后跳转到百度首页,并且控制台上打印“null”,表明在地址栏上直接访问资源,该请求头的值为空。
(4)在Example08应用中新建一个test.html,主要代码如例1-2所示:
例1-2 test.html
<body>
<a href="/Example08/RefererServlet">去RefererServlet</a>
</body>
(5)重新启动Tomcat服务器,在浏览器端访问test.html,如图1-2所示:
(6)点击图1-2所示的超链接“去RefererServlet”,控制台打印结果如图1-3所示:
图1-3中打印的Referer请求头的值正是访问RefererServlet的请求来源test.html的访问路径,其中包含“localhost”,所以“hello”也会被打印在控制台中。
有了Referer请求头,我们就可以根据它的值来判断访问来源是否是从本站发出,也可以通过它来做一些统计工作。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/253168.html