我知道Spring MVC控制器是Singletons。
因此,使用控制器的字段存储数据可能会导致安全问题。
有问题的是,假设它有一个允许用户下载文件的映射 -
@RequestMapping(value = "downloadReport", method=RequestMethod.GET)
public void downloadReport(@RequestParam("reportStoreId") String reportStoreId,
HttpServletResponse response, HttpServletRequest request) {
// use reportStoreId to fetch a report from file system and pass it to user using PrintWriter, response.getWriter(), etc...
}
因此,如果多个用户同时请求下载具有不同ID的文件,是否会导致一个用户获取另一个用户请求的文件?
答案 0 :(得分:1)
如果您downloadReport
的实施是Thread Safe,那么您不必担心这一点。
在您描述的情况下,多个线程将执行downloadReport
。如果执行中使用的所有变量都在每个线程的堆栈上,它们就不会发生冲突。这是一个简单的例子来说明:
@RequestMapping(value = "downloadReport", method=RequestMethod.GET)
public void downloadReport(@RequestParam("reportStoreId") String reportStoreId,
HttpServletResponse response, HttpServletRequest request) {
response.getWriter().print(getReportText(reportStoreId));
}
您需要实现getReportText
以返回指定报告的文本 - 或类似的内容。如您所见,getReportText
根据其参数返回文本。此参数位于线程的调用堆栈上,并且对于每个请求都是不同的(当然,除非两个请求是针对同一个文件)。
答案 1 :(得分:0)
简短的回答是否定的。
不是那么简短的回答。 对于每个请求,spring将调用控制器的方法,并将传递自己的HTTP请求解析的id值。堆栈变量与类字段非常不同。它的生命周期不同,它在方法启动时创建,在方法完成时被销毁。此外,其他并发运行的线程无法访问它,因此不会发生干扰。