簡體   English   中英

Spring MVC Singleton Controller-多個下載請求

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM