在 spring mvc 中,控制器方法可直接声明 httpservletrequest 和 httpservletresponse 类型参数,spring 自动按类型注入;非 handler 方法需通过 requestcontextholder 获取;优先使用 responseentity、@cookievalue 等 spring 封装抽象。

在 Spring MVC 中,可以直接通过方法参数获取 HttpServletRequest 和 HttpServletResponse 对象,Spring 会自动注入,无需手动从上下文提取。
控制器方法中直接声明参数
这是最常用、最推荐的方式。Spring MVC 会在调用控制器方法前,将当前请求和响应对象注入到匹配的参数中。
- 参数类型必须是
javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse - 参数名任意,Spring 依据类型匹配,不依赖名称
- 可与其它参数(如
@RequestParam、@RequestBody)共存
示例:
@GetMapping("/user")
public String getUser(HttpServletRequest request, HttpServletResponse response) {
String userAgent = request.getHeader("User-Agent");
response.setContentType("text/plain;charset=UTF-8");
return "success";
}
使用 @RequestAttribute 或 @SessionAttribute?不适用
注意:@RequestAttribute、@SessionAttribute 等注解用于获取作用域属性,不是获取原始的 Request/Response 对象本身。要操作请求头、输入流、输出流、状态码、重定向等,必须拿到原生对象。
在非 Handler 方法中获取(如拦截器或工具类)
如果不在控制器方法内,例如在拦截器、Service 层或通用工具类中需要访问 request/response,可通过 RequestContextHolder 获取:
ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();- 再调用
attrs.getRequest()和attrs.getResponse() - 注意:该方式依赖线程绑定,仅适用于 Web 环境且请求线程未结束时
- 不建议在异步线程或定时任务中使用,可能抛出
IllegalStateException
替代方案:优先使用 Spring 封装的抽象
除非必须调用原生 API(如写入二进制流、设置 cookie 的底层细节、手动 flush 响应),否则更推荐使用 Spring 提供的更高层支持:
- 用
@CookieValue读取 Cookie - 用
ResponseEntity>设置状态码、Header 和响应体 - 用
RedirectView或"redirect:xxx"处理重定向 - 用
@RequestHeader获取请求头
这样代码更易测试、更符合 Spring 风格,也避免与 Servlet API 强耦合。











