SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

2024-06-04 7966阅读

目录

  • 1、直接在Controller层方法参数上获取
  • 2、通过@Autowired注入
  • 3、通过RequestContextHolder获取

    1、直接在Controller层方法参数上获取

    仅仅适用在controller方法上。当Spring接收到HTTP请求时,会寻找一个合适的方法来处理该请求。如果该方法参数上标注了@RequestMapping或@Get、@Post等注解,Spring就会将HttpServletRequest对象注入到该参数中。

    @RestController
    public class Controller {
        @RequestMapping("/test")
        public String test(HttpServletRequest request,HttpServletResponse response) {
            return "success";
        }
    }
    

    2、通过@Autowired注入

    适用于所有的bean

    @Autowired
    private HttpServletRequest request;
    @Autowired
    private HttpServletResponse response;
    @RequestMapping("/test")
    public String test() {
        Enumeration headerNames = request.getHeaderNames();
        response.setHeader("header","header_value");
        return "success";
    }
    

    通过调试可以看到,注入的Reques是一个代理类,而这个被代理的目标由RequestObjectFactory.getObject() 获取

    SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式 第1张

    我们再看一下RequestObjectFactory.getObject() 的方法,最终还是走到了RequestContextHolder.getRequestAttributes()方法

    private static class RequestObjectFactory implements ObjectFactory, Serializable {
    	@Override
    	public ServletRequest getObject() {
    		return currentRequestAttributes().getRequest();
    	}
    	
    	@Override
    	public String toString() {
    		return "Current HttpServletRequest";
    	}
    }
    private static ServletRequestAttributes currentRequestAttributes() {
    	RequestAttributes requestAttr = RequestContextHolder.currentRequestAttributes();
    	if (!(requestAttr instanceof ServletRequestAttributes)) {
    		throw new IllegalStateException("Current request is not a servlet request");
    	}
    	return (ServletRequestAttributes) requestAttr;
    }
    

    3、通过RequestContextHolder获取

    适用于所有的方法,spring会通过RequestContextHolder.setRequestAttributes方法将RequestAttributes设置到ThreadLocal中。

    ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attr.getRequest();
    HttpServletResponse response = attr.getResponse();
    

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]