SpringBoot获取HttpServletRequest、HttpServletResponse的三种方式

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<String> headerNames = request.getHeaderNames();
    response.setHeader("header","header_value");
    return "success";
}

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

private static class RequestObjectFactory implements ObjectFactory<ServletRequest>, 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();
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值