HTTP请求头大小写问题踩坑记录

这篇具有很好参考价值的文章主要介绍了HTTP请求头大小写问题踩坑记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

类似网关的需求做请求转发,大概是接收到客户端http请求后做简单处理,之后通过httpclient转发出去,其中请求头需要全部透传过去。但是直接全部无脑传过去会出现问题,比如因为处理过请求,所以长度已经变了,客户端的请求头content-length已经不再适用了,再比如如果客户端设置了accept-encoding请求头,因为压缩过所以要处理结果比较麻烦。所以这两个请求头不直接传过去。所以就出现一下代码,遍历请求头的key之后设置httpclient请求参数中,排除这两个请求头。

//请求头透传
Enumeration<String> keys = request.getHeaderNames();
while(keys.hasMoreElements()) {
	String key = keys.nextElement();
	//将请求头accept-encoding去掉防止用户携带后服务器返回压缩的内容处理比较麻烦
	if ("accept-encoding".equals(key)) {
		continue;
	}
	//将请求头content-length,长度需要重新计算
	if ("content-length".equals(key)) {
		continue;
	}
	String value = req.getHeader(key);
	httpRequest.setHeader(key, value);
}

直接写常量很不优雅,万一常量有变化岂不是很难找修改的地方,所以就使用spring提供的请求头常量做修改如下

//请求头透传
Enumeration<String> keys = request.getHeaderNames();
while(keys.hasMoreElements()) {
	String key = keys.nextElement();
	//将请求头accept-encoding去掉防止用户携带后服务器返回压缩的内容处理比较麻烦
	if (HttpHeaders.ACCEPT_ENCODING.equals(key)) {
		continue;
	}
	//将请求头content-length,长度需要重新计算
	if (HttpHeaders.CONTENT_LENGTH.equals(key)) {
		continue;
	}
	String value = req.getHeader(key);
	httpRequest.setHeader(key, value);
}

结果发现没能过滤掉这两个请求头,断点一看原来HttpServlet传过来的请求头是全部小写的比如content-length,但是spring定义的常量是首字母大写的比如Content-Length。这不都是http协议竟然还有这种不同,两个都遵守协议应该一样的,而且前端传参是首字母大写的,到HttpServlet就变成小写了,HttpServlet是tomcat传过来的,是不是tomcat做了什么特殊处理?

分析

经过查阅资料和网上找答案,原来http协议header字段名大小写不敏感。https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
所以spring的首字母大写常量或者tomcat全部转成小写也是合规的
HTTP请求头大小写问题踩坑记录
知道了这个前提就问题就好解决,既然大小不敏感那么判断相等的时候都转成小写再判断即可。
但是好奇一个问题,既然大小不敏感那么tomcat全部处理成小写字母,万一用户通过getHeader获取请求头使用大写呢?猜想肯定时getHeader()方法做过处理,跟进代码就能找到答案了,跟进tomcat的HttpServletRequest 最后找到如下代码,方法equalsIgnoreCase()看名字就看出来,当用户通过getHeader()时是做了忽略大小写判断的。很容易相通,既然http协议要求大小写不敏感,那么保存的时候怎么存都得,但是取出来的时候需要做忽略大小写判断才符合http协议的要求。

    public MessageBytes getValue(String name) {
        for (int i = 0; i < count; i++) {
            if (headers[i].getName().equalsIgnoreCase(name)) {
                return headers[i].getValue();
            }
        }
        return null;
    }

解决

http协议header字段名大小写不敏感的,所以每个框架的写法可能都不一样,如果需要判断请求头相等需要都考虑,做忽略大小写判断。如下文章来源地址https://www.toymoban.com/news/detail-509767.html

//请求头透传
Enumeration<String> keys = request.getHeaderNames();
while(keys.hasMoreElements()) {
	String key = keys.nextElement();
	//将请求头accept-encoding去掉防止用户携带后服务器返回压缩的内容处理比较麻烦
	if (HttpHeaders.ACCEPT_ENCODING.equalsIgnoreCase(key)) {
		continue;
	}
	//将请求头content-length,长度需要重新计算
	if (HttpHeaders.CONTENT_LENGTH.equalsIgnoreCase(key)) {
		continue;
	}
	String value = req.getHeader(key);
	httpRequest.setHeader(key, value);
}

到了这里,关于HTTP请求头大小写问题踩坑记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spark读取hive表字段,区分大小写问题

    背景 spark任务读取hive表,查询字段为小写,但Hive表字段为大写,无法读取数据 问题错误: 如何解决呢? In version 2.3 and earlier, when reading from a Parquet data source table, Spark always returns null for any column whose column names in Hive metastore schema and Parquet schema are in different letter cases, no matter wh

    2024年01月23日
    浏览(50)
  • git 更换文件名大小写无法提交问题

    方法一: 1.使用 git config core.ignorecase命令查看当前git是否忽略了大小写 2.如果显示为true,使用git config core.ignorecase false命令将忽略大小写设置为false 3.再次提交文件时就能够将更换了大小写名称的文件提交上去了 方法二: 1、先将要提交的文件备份 2、删除对应文件并提交到

    2024年02月11日
    浏览(56)
  • 【问题处理】—— lombok 的 @Data 大小写区分不敏感

    今天在项目本地编译的时候,发现有个很奇怪的问题,一直提示某位置找不到符号, 但是实际在Idea中显示确实正常的,一开始以为又是IDEA的故障,所以重启了IDEA,并执行了mvn clean然后重新编译。但是问题并没有得到解决 这段代码最近没人改动过,所以很疑惑,所以点进了

    2024年02月03日
    浏览(59)
  • git怎么处理文件夹名称大小写重命名问题

    比如提交代码的时候不小心把文件名 kaimo 命名成了首字母大写的 Kaimo ,并且提交到了 git 仓库里面 这个时候我们把手动把 Kaimo 文件夹改成首字母小写的 kaimo 我们发现 git 并没有提示该文件重命名了 第一步:设置 git 的大小写敏感 可以使用命令 或者找到项目的隐藏文件夹

    2024年02月06日
    浏览(47)
  • 解决MySQL 8.0以上版本设置大小写不敏感的问题

            MySQL 8.0以上版本默认区分大小写,但在低版本(如5.7)中,可以通过在my.cnf配置文件的[mysqld]节下添加lower_case_table_names=1来设置大小写不敏感。然而,在MySQL 8.0以上版本中,添加此配置可能导致MySQL服务无法启动。本篇博客将介绍如何解决MySQL 8.0以上版本设置大小

    2024年02月02日
    浏览(37)
  • 【Java 笔记】使用Fastjson2时,对象转json首字母大小写问题

    开发环境: 一、JSON 转 Object 1.问题: 2.解决方案 二、Object转 JSON 三、SpringBoot设置fastjson2 为默认 pom.xml 2. 配置类 四、FastJson2 注解 默认 2. @JSONType 类注解 3. @JSONField(name = \\\"othername\\\") 属性注解 五、思考问题 Java 对象为什么需要序列化? 为什么对象没有实现Serializable接口,也可以

    2024年02月16日
    浏览(51)
  • 解决mysql8.0 lower_case_table_names 大小写敏感设置问题

    lower_case_table_names=1 表示 mysql 是不区分大小写的 lower_case_table_names=0 表示 mysql 是区分大小写的 根据网上资料得知mysql8.0之后,lower_case_table_names 配置必须在安装好 MySQL 后,初始化 mysql 配置时才有效。一旦 mysql 启动后,再设置是无效的,而且启动报错。 需要重新初始化MySQL数据

    2024年02月15日
    浏览(41)
  • 【现场问题】flink-cdc,Oracle2Mysql的坑,Oracle区分大小写导致

    Column ‘id’ is NOT NULL, however, a null value is being written into it. You can set job configuration ‘table.exec.sink.not-null-enforcer’=‘DROP’ to suppress this exception and drop such records silently 大致意思就是不能插入为空的数值。 为什么会报这个错误,我们来看DML的执行语句: insert into t_wx_target select

    2024年02月12日
    浏览(44)
  • java中字母、字符串,输入小写输出大写,输入大写输出小写、大小写转换

    思路: 1、利用“大小写字母之间正好相差32”这一特点                                                       2、用  toLowerCase()、toUpperCase() 字符串自带的方法  提示: Java中没有.nextChar()。 所以要读取char,我们使用  .next().charAt(0)  1、 输入小写输

    2024年02月07日
    浏览(90)
  • Python 大小写转换

    1.lower() 将字符串中的大写字母转换成小写字母 语法:str.lower() 2.upper() 将字符串的小写字母转换为大写字母 语法:str.upper() 3.capitalize() 将字符串的第一个字母变成大写,其余字母变为小写。 语法:str.capitalize()   4.title() 返回一个满足标题格式的字符串,即所有英文单词首字

    2024年02月13日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包