Java Spring MVC如何使HttpServletRequest字段线程安全?

Java Spring MVC如何使HttpServletRequest字段线程安全?,java,spring,spring-mvc,Java,Spring,Spring Mvc,代码: 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

代码:

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"));
    }
}
当我同时执行两个请求时,此执行的结果是:

  • Mozilla/5.0(Windows NT 6.1;WOW64;rv:26.0)Gecko/20100101 Firefox/26.0
  • Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,类似 壁虎)铬/32.0.1700.102狩猎/537.36
  • Mozilla/5.0(Windows NT 6.1;WOW64;rv:26.0)Gecko/20100101 Firefox/26.0
  • Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,类似 壁虎)铬/32.0.1700.102狩猎/537.36
  • 在运行时字段中输入
    com.sun.proxy.$Proxy45

    spring如何使读取线程安全?

    仅对上面M.Deinum的评论进行一点扩展,有几种方法可以用来避免将对请求的引用作为控制器状态的一部分

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

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

    3) 看看RequestContextHolder类的SpringAPI文档。你可以这样做:

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
                .currentRequestAttributes()).getRequest();
    
    这可能对你有用,也可能对你没用


    希望这有帮助:-)

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