0

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 のファイルのダウンロードを要求した場合、あるユーザーが別のユーザーによって要求されたファイルを取得する可能性がありますか?

4

2 に答える 2

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、パラメータに従ってテキストを返します。このパラメーターはスレッドの呼び出しスタックにあり、要求ごとに異なります (もちろん、2 つの要求が同じファイルに対するものでない限り)。

于 2013-11-04T16:45:30.690 に答える
0

短い答えはノーです。

それほど短い答えではありません。リクエストごとに、スプリングはコントローラーのメソッドを呼び出し、HTTP リクエストから解析された独自の ID 値を渡します。スタック変数は、クラス フィールドとは大きく異なります。ライフサイクルが異なり、メソッドの開始時に作成され、メソッドの終了時に破棄されます。また、同時に実行されている他のスレッドからアクセスできないため、干渉が発生することはありません。

于 2013-11-04T16:44:01.387 に答える