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

相关推荐

  1. SpringBoot获取 Request 方法

    2023-12-20 00:28:02       63 阅读
  2. SpringBoot解决跨域解决方案

    2023-12-20 00:28:02       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-20 00:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-20 00:28:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-20 00:28:02       82 阅读
  4. Python语言-面向对象

    2023-12-20 00:28:02       91 阅读

热门阅读

  1. 【缓存】一、Redis的基本使用与Redisson分布式锁

    2023-12-20 00:28:02       40 阅读
  2. 用VBA冻结excel文件的sheet1工作簿的第一行

    2023-12-20 00:28:02       60 阅读
  3. window.open的使用

    2023-12-20 00:28:02       62 阅读
  4. 【MySQL】数据类型

    2023-12-20 00:28:02       128 阅读
  5. 【难点】【LRU】146.LRU缓存

    2023-12-20 00:28:02       65 阅读
  6. 如何在Go中向错误中添加额外的信息

    2023-12-20 00:28:02       71 阅读
  7. C51--小车——PWM调速

    2023-12-20 00:28:02       61 阅读
  8. 微服务组件Gateway的学习

    2023-12-20 00:28:02       65 阅读
  9. c-Myc 抑制剂 2173505-97-8在科研领域的应用

    2023-12-20 00:28:02       59 阅读