Spring 编程常见错误 50 例
傅健
Cisco 高级软件工程师、Netty 源码贡献者
17065 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
结束语 (1讲)
期末测试 (1讲)
Spring 编程常见错误 50 例
15
15
1.0x
00:00/00:00
登录|注册

10 | Spring Web Header 解析常见错误

你好,我是傅健,这节课我们来聊聊 Spring Web 开发中 Header 相关的常见错误案例。
在上节课,我们梳理了 URL 相关错误。实际上,对于一个 HTTP 请求而言,URL 固然重要,但是为了便于用户使用,URL 的长度有限,所能携带的信息也因此受到了制约。
如果想提供更多的信息,Header 往往是不二之举。不言而喻,Header 是介于 URL 和 Body 之外的第二大重要组成,它提供了更多的信息以及围绕这些信息的相关能力,例如 Content-Type 指定了我们的请求或者响应的内容类型,便于我们去做解码。虽然 Spring 对于 Header 的解析,大体流程和 URL 相同,但是 Header 本身具有自己的特点。例如,Header 不像 URL 只能出现在请求中。所以,Header 处理相关的错误和 URL 又不尽相同。接下来我们看看具体的案例。

案例 1:接受 Header 使用错 Map 类型

在 Spring 中解析 Header 时,我们在多数场合中是直接按需解析的。例如,我们想使用一个名为 myHeaderName 的 Header,我们会书写代码如下:
@RequestMapping(path = "/hi", method = RequestMethod.GET)
public String hi(@RequestHeader("myHeaderName") String name){
//省略 body 处理
};
定义一个参数,标记上 @RequestHeader,指定要解析的 Header 名即可。但是假设我们需要解析的 Header 很多时,按照上面的方式很明显会使得参数越来越多。在这种情况下,我们一般都会使用 Map 去把所有的 Header 都接收到,然后直接对 Map 进行处理。于是我们可能会写出下面的代码:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Spring Web开发中Header相关的常见错误案例包括接受Header使用错Map类型和错认为Header名称首字母可以一直忽略大小写。在解析Header时,直接获取Header是可以忽略大小写的,但从接收过来的Map中获取Header是不能忽略大小写的。针对第一个案例,要完整接收到所有的Header,不能直接使用Map而应该使用MultiValueMap或HttpHeaders。对于第二个案例,需要注意Header名称在任何情况下并不都可以不区分大小写来获取值。文章通过具体案例分析和问题修正,帮助读者理解Spring Web开发中Header解析的常见错误及解决方法。 文章通过具体案例分析和问题修正,帮助读者理解Spring Web开发中Header解析的常见错误及解决方法。文章通过具体案例分析和问题修正,帮助读者理解Spring Web开发中Header解析的常见错误及解决方法。 在Spring Boot使用内嵌Tomcat容器时,添加Header会执行关键步骤。然而,设置Content-Type作为特殊Header时,实际返回的Content-Type是根据实际的返回值及类型等多个因素来决定的。针对这个问题,可以修改请求中的Accept头或标记返回类型,以控制最终协商的结果为JSON。通过这节课的学习,读者了解到了在Spring解析Header中的一些常见错误及其背后的深层原因,包括接收Header使用错Map类型和错认为Header名称首字母可以一直忽略大小写。希望读者以后在解析Header时会更有信心。 思考题提到在Controller层中随意自定义常用头有时候会失效,引发读者思考这个结论是否普适,即在使用其他内置容器或者在其他开发框架下,是否也会存在一样的问题。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring 编程常见错误 50 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 雨落~紫竹
    这章所有问题都是不规范导致的
    2022-06-20
    2
  • 天天向上
    请教下什么情况下需要修改content type
    2022-10-01归属地:浙江
  • 星期八
    案例3中“决定用哪一种 MediaType 返回” header有值,为什么会走到下面去选择MediaType#TEXT_PLAIN?
    2022-03-13
  • 虹炎
    案例2说:1. 存取 Map 的 Header 是没有忽略大小写的 然后给出了源码: private void findNext() { next=null; for(; pos< size; pos++ ) { next=headers.getName( pos ).toString(); for( int j=0; j<pos ; j++ ) { if( headers.getName( j ).equalsIgnoreCase( next )) { // duplicate. next=null; break; } } if( next!=null ) { // it's not a duplicate break; } } // next time findNext is called it will try the // next element pos++; } 然后说:返回结果并没有针对 Header 的名称做任何大小写忽略或转化工作。没看懂。其他小伙伴看懂了吗? 这里说的返回结果指什么? if( headers.getName( j ).equalsIgnoreCase( next )) 这行代码不是忽略了大小写了吗?
    2021-05-16
    4
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部