Spring MVC:RestController中能否Autowired注入HttpServletRequest?并发场景下是否安全?
关于Spring MVC RestController中Autowired注入HttpServletRequest的问题解答
没问题,我来帮你理清这个问题:
1. 能不能通过@Autowired注入HttpServletRequest?
当然可以!Spring对HttpServletRequest这类请求相关的对象做了特殊处理,你完全可以像代码示例里那样,直接在@RestController类中用@Autowired注入它,不需要做额外配置。
2. 高并发环境下,注入的对象会不会对应不同的请求实例?
这是个关键问题,答案是:每次请求都会拿到当前请求对应的真实实例。
你注入的其实不是一个固定的HttpServletRequest对象,而是Spring生成的一个代理对象。这个代理对象会在你调用它的方法时,从当前线程的请求上下文(Spring用ThreadLocal维护)中获取真实的请求实例。所以在高并发场景下,每个请求线程拿到的都是属于自己的HttpServletRequest,不会出现线程安全问题,完全不用担心多个请求共用同一个实例的情况。
针对你的限制场景的适配
刚好符合你的需求:因为自动生成的接口方法不能添加HttpServletRequest作为参数,这种成员变量注入的方式完美避开了修改方法签名的问题,你可以直接在接口实现方法里使用注入的servletRequest对象,获取当前请求的信息。
给你整理下完整的代码示例:
@RestController public class MyController implements MyInterface { @Autowired private HttpServletRequest servletRequest; @Override @RequestMapping("/your-api-path") public String yourAutoGeneratedMethod() { // 这里调用servletRequest的方法,拿到的是当前请求的真实实例 String requestUri = servletRequest.getRequestURI(); String method = servletRequest.getMethod(); return String.format("当前请求URI: %s, 请求方法: %s", requestUri, method); } }
小提醒
要注意的是:如果在非请求线程(比如异步任务、定时任务)中调用这个注入的servletRequest,会因为当前线程没有请求上下文而拿到null,这时候要提前做判空处理,或者通过其他方式传递请求信息。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

