0
代碼:Spring MVC如何使HttpServletRequest字段線程安全?
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"));
}
}
當我在同時2個請求,該執行的結果是:
- 的Mozilla/5.0(Windows NT的6.1; WOW64; RV:26.0)壁虎/ 20100101 火狐/ 26.0
- 的Mozilla/5.0(Windows NT的6.1; WOW64)爲AppleWebKit/537.36(KHTML,像壁虎 )的Chrome/Safari的32.0.1700.102/537.36
- 的Mozilla/5.0(Windows NT的6.1; WOW64; RV:26.0 )壁虎/ 201 00101 Firefox/26.0
- Mozilla/5.0(Windows NT 6.1; WOW64)爲AppleWebKit/537.36(KHTML,像 壁虎)鉻/ 32.0.1700.102 Safari瀏覽器/ 537.36
在運行時字段具有類型com.sun.proxy.$Proxy45
。 春天如何使它可以線程安全地閱讀?
它注入的實際對象的代理和確實需要時(實際請求被綁定到當前執行的線程)的查找。但是,爲什麼你要注入'HttpServletRequest'?您可以簡單地將它作爲參數添加到您的方法中。我會認爲後者是一種更好的方法,然後注入它。 –
謝謝,我認爲如此。它很有趣,它是如何工作的。 – user2187298