SpringMVC的Controller默認為單例模式,多線程併發請求時,如何保證數據安全?特別是方法中的局部變量是否會被不同用戶請求互相覆蓋?
Controller單例模式下是線程安全的,不會出現用戶數據互相覆蓋的情況。
每個HTTP請求到達時,Servlet容器(如Tomcat)會創建獨立的線程處理,調用Controller的同一實例方法。
@Controller
public class UserController {
// 危險:實例變量,多線程共享
private User user;
// 安全:局部變量,線程私有
@RequestMapping("/save")
public String saveUser() {
User user = new User(); // 每次請求創建新對象
// 業務邏輯...
return "success";
}
}
| 場景 | 是否安全 | 說明 |
|---|---|---|
| 方法局部變量 | ✅ 安全 | 線程私有棧隔離 |
| 方法參數 | ✅ 安全 | 線程私有 |
| Controller實例字段 | ❌ 危險 | 多線程共享,需加鎖或ThreadLocal |
| Service單例注入 | ✅ 安全 | 無狀態服務,不持有請求相關狀態 |
| HttpSession | ✅ 隔離 | 按SessionID隔離,非線程機制 |