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"));
}
}
当我同时执行两个请求时,此执行的结果是:
com.sun.proxy.$Proxy45
。
spring如何使读取线程安全?仅对上面M.Deinum的评论进行一点扩展,有几种方法可以用来避免将对请求的引用作为控制器状态的一部分 1) 如前所述,直接注入请求作为方法签名的一部分 2) 通过在方法签名中使用@RequestParam注释,只能使用您直接感兴趣的请求参数 3) 看看RequestContextHolder类的SpringAPI文档。你可以这样做:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes()).getRequest();
这可能对你有用,也可能对你没用
希望这有帮助:-)它插入实际对象的代理,并在需要时进行查找(实际请求绑定到当前执行的线程)。但是,为什么要插入
HttpServletRequest
?您可以简单地将其作为参数添加到方法中。我会认为后者是一个更好的方法,然后注入它。谢谢,我想。它是如何有趣的工作。