使用HttpServletRequest对象getHeader("referer")方法实现下载资源防盗链
1. 开发工具:
jdk-1.8
tomcat-7.0
eclipse
2. 关于代码中的方法:
1. getHeader(“referer”);
部分翻译如下:
String getHeader(java.lang.String name)将指定请求头的值作为字符串返回。如果请求不包含指定名称的头,则此方法返回null。如果有多个具有相同名称的头,则此方法返回请求中的第一个头。头名称不区分大小写。您可以对任何请求头使用此方法。
2. getServerName();
获得应用的根url,比如说你的应用的根路径是 http://localhost:8080,那么该方法的返回值为字符串 “localhost”。
更多相关↓
request.getScheme():获取协议类型:http
request.getServerName():获取服务器域名或IP地址:localhost
request.getServerPort():获取服务器端口:8080(tomcat端口)
3. startsWith();
startsWith()方法用来判断当前字符串是否是以另外一个给定的子字符串“开头”的,根据判断结果返回 true 或 false。
↓↓↓该图是statrtswith()源码片段↓↓↓
3.具体代码实现:
1. 创建名字为servlet3的servert文件
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");//输出中文不乱码
PrintWriter out = response.getWriter();
String referer= request.getHeader("referer");
/*
* referer头,告知服务器该请求是从哪个页面链接过来的。
* referer经常被用于页面访问统计、图片防盗链等。
*/
System.out.println("referer="+referer);
String url="http://"+request.getServerName();//获得应用的根url
System.out.println("url="+url);
if(referer!=null&&referer.startsWith(url)) {
/*
* 判断不为空,且startsWith()返回true,即验证通过
*/
out.println("可以下载");
}else{
out.println("不能下载,需要到index.jsp中进行下载");
// RequestDispatcher dispatcher= request.getRequestDispatcher("index.jsp");
// dispatcher.forward(request, response);
//↑↑↑↑启用后可请求转发到自己定义的下载链接页面中,即index.jsp
}
}
2. 创建名为index.jsp的jsp文件代码如下
<!-- 在body中定义超链接标签,连接到上面的servlet3中; -->
<body>
<a href="/text/Servlet3">downloading</a>
</body>
4.结果图片展示:
先进入下载页面index.jsp,效果如下 ↓
点击index.jsp中的downloading超链接,跳转到servlet3中,效果如下 ↓
在控制台可查看定义的referer与url的参数;
上面是正常点击进入,下面跳过index.jsp,直接在浏览器输入servlet3的地址,进入到sevlet3中,效果如下 ↓
5.完结
这样就实现了防盗链。