在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 getRequestHashCode(HttpServletRequest request) {
        Map rtn = new HashMap<>();
        rtn.put("hashCode",request.hashCode());
        return rtn;
    }
    // 在浏览器不断按F5发送请求,
}
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在浏览器中不断按F5,返回结果

你可能感兴趣的:(springmvc)