【问题标题】:How Spring MVC make HttpServletRequest field threadsafe?Spring MVC 如何使 HttpServletRequest 字段成为线程安全的?
【发布时间】:2014-02-05 08:08:33
【问题描述】:

代码:

package com.test.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/")
public class Controller {
    private HttpServletRequest request;

    public HttpServletRequest getRequest() {
        return request;
    }
    @Autowired
    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }
    @RequestMapping("safe-read")
    public void threadSafeRead() throws InterruptedException {
        System.out.println(request.getHeader("user-agent"));
        Thread.sleep(TimeUnit.MILLISECONDS.convert(5,TimeUnit.SECONDS));
        System.out.println(request.getHeader("user-agent"));
    }
}

当我同时做两个请求时,这个执行的结果是:

  1. Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 火狐/26.0
  2. Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 像 壁虎)Chrome/32.0.1700.102 Safari/537.36
  3. Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 火狐/26.0
  4. Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, 像 壁虎)Chrome/32.0.1700.102 Safari/537.36

在运行时字段中输入com.sun.proxy.$Proxy45。 spring 如何使它成为线程安全的读取?

【问题讨论】:

  • 它注入实际对象的代理并在需要时进行查找(实际请求绑定到当前执行线程)。但是为什么要注入HttpServletRequest?您可以简单地将它作为参数添加到您的方法中。我认为后者是一种比注入它更好的方法。
  • 谢谢,我是这么认为的。它的工作原理很有趣。

标签: java spring spring-mvc


【解决方案1】:

稍微扩展一下 M. Deinum 上面的评论,您可以使用一些方法来避免将请求的引用作为控制器状态的一部分。

1) 如前所述,直接将请求作为方法签名的一部分注入。

2) 通过在方法签名中使用 @RequestParam 注释,仅使用您直接感兴趣的请求参数。

3) 查看 RequestContextHolder 类的 Spring api 文档。您可以执行以下操作:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
            .currentRequestAttributes()).getRequest();

这对你可能有用也可能没用。

希望这会有所帮助:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多