代码:
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
。
弹簧如何使其成为线程安全的读取?
答案 0 :(得分:0)
为了扩展M. Deinum上面的评论,我们可以使用一些方法来避免将请求的引用作为控制器状态的一部分。
1)如前所述,直接将请求作为方法签名的一部分注入。
2)只使用方法签名中的@RequestParam注释处理您直接感兴趣的请求参数。
3)查看RequestContextHolder类的Spring api文档。你可以这样做:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.currentRequestAttributes()).getRequest();
对您有用或可能没用。
希望这会有所帮助: - )