2013-11-04 47 views
0

我知道Spring MVC控制器是单身人士。Spring MVC单身控制器 - 多个下载请求

因此,使用控制器的字段来存储数据可能会导致安全问题。

什么的问题是,假设它有一个映射,允许用户下载一个文件 -

@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

如果您的实施downloadReportThread 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根据其参数返回文本。此参数位于线程的调用堆栈中,并且对于每个请求都不相同(除非这两个请求是针对同一个文件的)。

0

简短的回答是否定的。

不是那么简短的答案如下。 对于每个请求,spring将调用控制器的方法,并且会传递自己从HTTP请求中解析出的id值。堆栈变量与class字段非常不同。它的生命周期不同,它在方法启动时创建,并在方法结束时销毁。另外它不能被其他同时运行的线程访问,所以不会发生干扰。