[英]Spring MVC Singleton Controller - Multiple Download Requests
我知道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的文件,是否可能导致一个用户获得另一用户请求的文件?
如果您对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
根据其参数返回文本。 此参数在线程的调用堆栈上,并且对于每个请求都将有所不同(当然,除非两个请求都针对同一文件)。
最简洁的答案是不。
答案不是那么简短。 对于每个请求,spring将调用控制器的方法,并将传递其自己的从HTTP请求解析的id值。 堆栈变量与类字段有很大不同。 它的生命周期不同,它是在方法启动时创建的,并在方法完成时销毁的。 而且其他并发运行的线程也无法访问它,因此不会发生干扰。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.