0


SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

目录

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

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

@RestControllerpublicclassController{@RequestMapping("/test")publicStringtest(HttpServletRequest request,HttpServletResponse response){return"success";}}

2、通过@Autowired注入

适用于所有的bean

@AutowiredprivateHttpServletRequest request;@AutowiredprivateHttpServletResponse response;@RequestMapping("/test")publicStringtest(){Enumeration<String> headerNames = request.getHeaderNames();
    response.setHeader("header","header_value");return"success";}

通过调试可以看到,注入的Reques是一个代理类,而这个被代理的目标由RequestObjectFactory.getObject() 获取
在这里插入图片描述
我们再看一下RequestObjectFactory.getObject() 的方法,最终还是走到了RequestContextHolder.getRequestAttributes()方法

privatestaticclassRequestObjectFactoryimplementsObjectFactory<ServletRequest>,Serializable{@OverridepublicServletRequestgetObject(){returncurrentRequestAttributes().getRequest();}@OverridepublicStringtoString(){return"Current HttpServletRequest";}}privatestaticServletRequestAttributescurrentRequestAttributes(){RequestAttributes requestAttr =RequestContextHolder.currentRequestAttributes();if(!(requestAttr instanceofServletRequestAttributes)){thrownewIllegalStateException("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();
标签: spring boot 后端 java

本文转载自: https://blog.csdn.net/Session_s/article/details/135030876
版权归原作者 村口老师傅 所有, 如有侵权,请联系我们删除。

“SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式”的评论:

还没有评论