在controller的方法引數中加入HttpServletRequest
阿新 • • 發佈:2018-11-04
@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" );
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如上程式碼,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");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
問題:
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傳送請求,
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
在瀏覽器中不斷按F5,返回結果