SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

03-03 8585阅读 0评论

目录

  • 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();
    

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,8585人围观)

还没有评论,来说两句吧...

目录[+]