引入背景
@Controller
public class TestController{
public String getUserId(HttpServletRequest request){
return (String)request.getSession().getAttribute("userId");
}
public String getOrganId(HttpServletRequest request){
return (String)request.getSession().getAttribute("organId");
}
}
如上代码,controller中若要访问request的方法较多,在每个方法中都声明一个request参数很繁琐,为了节省代码,直接在类的成员变量上使用@Autowired声明HttpServletRequest。
@Controller
public class TestController{
@Autowire
private HttpServletReqeust request;
public String getUserId(){
return (String)request.getSession().getAttribute("userId");
}
public String getOrganId(){
return (String)request.getSession().getAttribute("organId");
}
}
问题:
controller是单例的,这样写会不会导致后面的request覆盖前面的request,在并发条件下有线程安全问题?
结论:
此方法是线程安全的,不会存在覆盖问题。
各情况分析
仅在方法参数中声明
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/getRequestHashCode")
@ResponseBody
public Map<String,Object> getRequestHashCode(HttpServletRequest request) {
Map<String,Object> rtn = new HashMap<>();
rtn.put("hashCode",request.hashCode());
return rtn;
}
// 在浏览器不断按F5发送请求,
}
在浏览器中不断按F5,返回结果