- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
12.3 范例 2:防止交叉引用
心怀叵测的竞争对手有可能通过交叉引用“窃取”你的网站资产,例如,将你的资料公然放在他的网站上,好像那些东西原本就属于他的一样。如果通过编程控制,使得只有当 referer 标题中包含你的域名时才发出资源,就可以防止那种情况发生。当然,那些心意坚决的窃贼仍然有办法下载到你的东西,但是绝不会像以前那样不费吹灰之力就能得到。
download 应用程序利用清单 12.4 中的 ImageController 类,使得仅当 referer 标题不为 null 时,才将图片发送给浏览器。这样可以防止仅在浏览器中输入网址就能下载图片的情况发生。
清单 12.4 ImageController 类
package controller;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class ImageController {
private static final Log logger =
LogFactory.getLog(ImageController.class);
@RequestMapping(value="/image_get/{id}", method = RequestMethod.GET)
public void getImage(@PathVariable String id,
HttpServletRequest request, HttpServletResponse response,
@RequestHeader String referer) {
if (referer != null) {
String imageDirectory = request.getServletContext().
getRealPath("/WEB-INF/image");
Path file = Paths.get(dataDirectory, id + ".jpg");
if (Files.exists(file)) {
response.setContentType("image/jpg");
try {
Files.copy(file, response.getOutputStream());
} catch (IOException ex) {
e.printStackTrace();
}
}
}
}
}原则上,ImageController 类的作用与 ResourceController 无异。getImage 方法开头处的 if 语句,可以确保只有当 referer 标题不为 null 时,才发出图片。
利用清单 12.5 中的 images.html 文件,可以对这个应用程序进行测试。
清单 12.5 images.html 文件
<!DOCTYPE html>
<html>
<head>
<title>Photo Gallery</title>
</head>
<body>
<img src="get-image/1"/>
<img src="get-image/2"/>
<img src="get-image/3"/>
<img src="get-image/4"/>
<img src="get-image/5"/>
<img src="get-image/6"/>
<img src="get-image/7"/>
<img src="get-image/8"/>
<img src="get-image/9"/>
<img src="get-image/10"/>
</body>
</html>要想看到 ImageServlet 的效果,请在浏览器中打开以下网址:
http://localhost:8080/download/images.html图 12.1 展示了使用 ImageServlet 后的效果。

图 12.1 使用 ImageServlet 后的效果
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论