1. 程式人生 > >在controller的方法引數中加入HttpServletRequest

在controller的方法引數中加入HttpServletRequest

@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,返回結果