[英]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.