有一些站点自己没有提供下载空间,但是为了吸引人气和提高站点的访问量,他们也提供了各种软件的下载页面,并让下载的超链接指向其他站点上的资源。另外一些真正提供了下载空间的站点为了防止这种“盗链”,需要检查请求的来路,只接受本站内的页面链接进来的下载请求,而阻止其他站点的页面链接进来的下载请求。要实现这样的功能,就需要检查请求消息的referer头字段是否与本站匹配。
:动手体验:利用Referer请求头阻止“盗链”
(1)按例程6-3编写一个名为DownManagerServlet的Servlet程序,这个Servlet程序负责提供下载内容,但它要求下载请求必须通过本站的下载页面链接进来,否则将请求转发给本站的下载说明页。
例程6-3 DownManagerServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownManagerServlet extends HttpServlet
{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html ;charset=gb2312");
PrintWriter out = response.getWriter();
String referrer = request.getHeader("referer");
String sitePart = "http://" + request.getServerName();
if(referrer!=null && referrer.startsWith(sitePart))
{
//处理正当的下载请求,这里只进行示意
out.println("dealing download ...");
}
else
{
//非法下载请求跳转到本站的下载说明页
RequestDispatcher rd = request.getRequestDispatcher("/down.html");
rd.forward(request,response);
}
}
}
编译DownManagerServlet.java文件,确保编译后生成的class文件存放在了<tomcat的安装目录>\webapps\it315\WEB-INF\classes目录中。
(2)在<tomcat的安装目录>\webapps\it315\WEB-INF\web.xml文件中注册该Servlet,并设置其映射URL。在web.xml文件中的相应位置处增加如下两段内容:
<servlet>
<servlet-name>DownManagerServlet</servlet-name>
<servlet-class>DownManagerServlet</servlet-class>
</servlet>
……
<servlet-mapping>
<servlet-name>DownManagerServlet</servlet-name>
<url-pattern>/servlet/DownManagerServlet</url-pattern>
</servlet-mapping>
保存web.xml文件后,重新启动Tomcat。
(3)在<tomcat的安装目录>\webapps\it315目录中编写一个名称为down.html的网页文件,内容如下:
<base href="http://localhost:8080/it315/down.html" />
down
接着在浏览器地址栏中输入如下地址:
http://localhost:8080/it315/servlet/DownManagerServlet
由于这是直接在浏览器地址栏中输入的访问地址,请求消息中不含Referer请求头,DownManagerServlet将down.html页面转发给浏览器
单击图6.4中的超链接再次访问DownManagerServlet,由于这时的请求消息中包含有Referer请求头且其值与DownManagerServlet位于同一WEB站点,DownManagerServlet接受下载请求。
:动手体验:利用Referer请求头阻止“盗链”
(1)按例程6-3编写一个名为DownManagerServlet的Servlet程序,这个Servlet程序负责提供下载内容,但它要求下载请求必须通过本站的下载页面链接进来,否则将请求转发给本站的下载说明页。
例程6-3 DownManagerServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownManagerServlet extends HttpServlet
{
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html ;charset=gb2312");
PrintWriter out = response.getWriter();
String referrer = request.getHeader("referer");
String sitePart = "http://" + request.getServerName();
if(referrer!=null && referrer.startsWith(sitePart))
{
//处理正当的下载请求,这里只进行示意
out.println("dealing download ...");
}
else
{
//非法下载请求跳转到本站的下载说明页
RequestDispatcher rd = request.getRequestDispatcher("/down.html");
rd.forward(request,response);
}
}
}
编译DownManagerServlet.java文件,确保编译后生成的class文件存放在了<tomcat的安装目录>\webapps\it315\WEB-INF\classes目录中。
(2)在<tomcat的安装目录>\webapps\it315\WEB-INF\web.xml文件中注册该Servlet,并设置其映射URL。在web.xml文件中的相应位置处增加如下两段内容:
<servlet>
<servlet-name>DownManagerServlet</servlet-name>
<servlet-class>DownManagerServlet</servlet-class>
</servlet>
……
<servlet-mapping>
<servlet-name>DownManagerServlet</servlet-name>
<url-pattern>/servlet/DownManagerServlet</url-pattern>
</servlet-mapping>
保存web.xml文件后,重新启动Tomcat。
(3)在<tomcat的安装目录>\webapps\it315目录中编写一个名称为down.html的网页文件,内容如下:
<base href="http://localhost:8080/it315/down.html" />
down
接着在浏览器地址栏中输入如下地址:
http://localhost:8080/it315/servlet/DownManagerServlet
由于这是直接在浏览器地址栏中输入的访问地址,请求消息中不含Referer请求头,DownManagerServlet将down.html页面转发给浏览器
单击图6.4中的超链接再次访问DownManagerServlet,由于这时的请求消息中包含有Referer请求头且其值与DownManagerServlet位于同一WEB站点,DownManagerServlet接受下载请求。