java - Spring MVC 单例 Controller - 多个下载请求

标签 java session spring-mvc singleton-methods

我知道 Spring MVC Controller 是单例的。

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

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

@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 根据其参数返回文本。该参数位于线程的调用堆栈上,并且对于每个请求都会不同(当然,除非两个请求针对同一个文件)。

关于java - Spring MVC 单例 Controller - 多个下载请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19772437/

相关文章:

java - 将 JSON 请求发送到 Restful Web 服务到 JAXB 对象

java - 从独立客户端上传文件

java - 为什么 Apache Commons 将 '१२३' 视为数字?

php - 无法结束 PHP session

java - Spring - 拦截 bean 创建和注入(inject)自定义代理

hibernate - org.h2.jdbc.JdbcSQL异常 : Connection is broken: "java.net.ConnectException: Connection refused: connect: localhost" [90067-193]

java - 错误 RetroFit Begin ARray Object .IllegalStateException

java - 如何在 weblogic 中共享 session

Laravel,显示 dd() 结果而没有 die -> d(),dump()?

java - Spring MVC 3 Controller 请求处理程序通用