Spring MVC获取HTTP请求头的两种方式小结
1 前言
请求是任何Web服务要关注的对象,而请求头也是其中非常重要的信息。本文将通过代码讲解如何在Spring MVC项目中获取请求头的内容。主要通过两种方式获取:
(1)通过注解@RequestHeader获取,需要在Controller中显式获取;
(2)通过RequestContextHolder获取,可以任何地方获取。
接下来通过代码讲解。
2 通过注解@RequestHeader获取
需要在Controller中显示使用@RequestHeader。
2.1 获取某个请求头
只获取其中一个请求头,相当容易,代码如下:
@GetMapping("/webSite") public String webSite(@RequestHeader("webSite")String webSite) { return "The webSite is " + webSite; }
这里获取的是webSite这个请求头,测试如下:
$ curl http://localhost:8088/header/webSite -H 'webSite: www.pkslow.com' The webSite is www.pkslow.com
我们查看@RequestHeader的源码,它还有其它属性,如下所示:
public @interface RequestHeader { @AliasFor("name") String value() default ""; @AliasFor("value") String name() default ""; boolean required() default true; String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n"; }
2.1.1 属性required
required属性默认为true,如果不配置而客户端没有传递该请求头,会有报错。如果配置为false且没有请求头,值为null。代码如下:
@GetMapping("/webSite-not-required") public String webSiteNotRequired(@RequestHeader(value = "webSite", required = false)String webSite) { return "The webSite is " + webSite; }
测试结果如下:
$ curl http://localhost:8088/header/webSite-not-required -H 'webSite: www.pkslow.com' The webSite is www.pkslow.com $ curl http://localhost:8088/header/webSite-not-required The webSite is null
2.1.2 属性defaultValue
defaultValue更容易理解,通过它来设置默认值。如果有传递则获取客户端传递的值,如果没有传递为默认值。代码如下:
@GetMapping("/webSite-defaultValue") public String webSiteDefaultValue(@RequestHeader(value = "webSite", defaultValue = "pkslow.com")String webSite) { return "The webSite is " + webSite; }
测试结果如下:
$ curl http://localhost:8088/header/webSite-defaultValue -H 'webSite: www.pkslow.com' The webSite is www.pkslow.com $ curl http://localhost:8088/header/webSite-defaultValue The webSite is pkslow.com
2.2 获取所有请求头
注解@RequestHeader除了可以获取某个请求头,还可以一次性获取所有请求头,这时不需要指定名字。可以通过Map、MultiValueMap和HttpHeaders来获取所有请求头的值,示例代码如下:
@GetMapping("/allMap") public Map<String, String> allMap(@RequestHeader Map<String, String> headers) { return headers; } @GetMapping("/allMultiValueMap") public Map<String, String> allMultiValueMap(@RequestHeader MultiValueMap<String, String> headers) { return headers.toSingleValueMap(); } @GetMapping("/allHttpHeaders") public String allHttpHeaders(@RequestHeader HttpHeaders headers) { return headers.toString(); }
测试如下:
$ curl http://localhost:8088/header/allMap -H 'Authorization: Basic cGtzbG93OjEyMzQ1Ng==' -H 'webSite: www.pkslow.com' {"host":"localhost:8088","user-agent":"curl/7.64.1","accept":"*/*","authorization":"Basic cGtzbG93OjEyMzQ1Ng==","website":"www.pkslow.com"} $ curl http://localhost:8088/header/allMultiValueMap -H 'Authorization: Basic cGtzbG93OjEyMzQ1Ng==' -H 'webSite: www.pkslow.com' {"host":"localhost:8088","user-agent":"curl/7.64.1","accept":"*/*","authorization":"Basic cGtzbG93OjEyMzQ1Ng==","website":"www.pkslow.com"} $ curl http://localhost:8088/header/allHttpHeaders -H 'Authorization: Basic cGtzbG93OjEyMzQ1Ng==' -H 'webSite: www.pkslow.com' [host:"localhost:8088", user-agent:"curl/7.64.1", accept:"*/*", authorization:"Basic cGtzbG93OjEyMzQ1Ng==", website:www.pkslow.com]
3 通过RequestContextHolder获取
通过RequestContextHolder来获取则可以在其它层获取。它先获取Request对象,再获取请求头。代码如下:
@GetMapping("/webSite-RequestContextHolder") public String webSiteRequestContextHolder() { ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); // get the request HttpServletRequest request = requestAttributes.getRequest(); return "The webSite is " + request.getHeader("webSite"); }
测试如下:
$ curl http://localhost:8088/header/webSite-RequestContextHolder -H 'webSite: www.pkslow.com' The webSite is www.pkslow.com
4 总结
以上两个方法,对于WebFlux而言,通过注解@RequestHeader获取是可行的;通过RequestContextHolder获取则不行,可参考【在Spring WebFlux的任何地方获取Request对象】。
代码请查看:https://github.com/LarryDpk/pkslow-samples
以上就是Spring MVC获取HTTP请求头的两种方式小结的详细内容,更多关于Spring MVC获取HTTP请求头的资料请关注猪先飞其它相关文章!
相关文章
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
Spring Cloud 中@FeignClient注解中的contextId属性详解
这篇文章主要介绍了Spring Cloud 中@FeignClient注解中的contextId属性详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-25Springboot如何实现Web系统License授权认证
这篇文章主要介绍了Springboot如何实现Web系统License授权认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-28- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
C#使用Http Post方式传递Json数据字符串调用Web Service
这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25解决Feign切换client到okhttp无法生效的坑(出现原因说明)
这篇文章主要介绍了解决Feign切换client到okhttp无法生效的坑(出现原因说明),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题
这篇文章主要介绍了完美解决SpringCloud-OpenFeign使用okhttp替换不生效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-25- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
如何在Spring WebFlux的任何地方获取Request对象
这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了详解SpringCloudGateway内存泄漏问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-16
- @Autowired 注解的主要功能就是完成自动注入,使用也非常简单,但这篇文章主要给大家介绍了关于Spring为什么不推荐使用@Autowired注解的相关资料,需要的朋友可以参考下...2021-11-03
Springboot如何使用mybatis实现拦截SQL分页
这篇文章主要介绍了Springboot使用mybatis实现拦截SQL分页,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-19HTTP 415错误-Unsupported media type详解
这篇文章主要介绍了HTTP 415错误-Unsupported media type详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...2021-08-16详解nginx同一端口监听多个域名和同时监听http与https
这篇文章主要介绍了详解nginx同一端口监听多个域名和同时监听http与https的相关资料,需要的朋友可以参考下...2017-07-06- 这篇文章主要介绍了vue+axios全局添加请求头和参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-24
- 这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?
这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25Spring Data JPA 关键字Exists的用法说明
这篇文章主要介绍了Spring Data JPA 关键字Exists的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-10