博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
400 Bad request 一例
阅读量:2440 次
发布时间:2019-05-10

本文共 1231 字,大约阅读时间需要 4 分钟。

    某次定位请求,发现400 bad request,抓包发现请求头如下

POST /xx/xx/user/default/subscribe HTTP/1.1Authorization: xxHost: http://100.40.205.122:8080Content-Type: application/json;charset=utf-8Content-Length: 248Connection: Keep-AliveUser-Agent: Apache-HttpClient/4.3.1 (java 1.5)Accept-Encoding: gzip,deflate
可能有同学一眼就看出来,问题出在Host字段多了个http://

    tomcat是怎么解析Host头的呢?以7.0.70为例,参考AbstractHttp11Processor.parseHost 方法,首先判断是否是ipv4的ip,如果是,用:分隔,左边为ip,右边为端口;如果没有:则根据url里开头是http还是https分别设置端口为80/443,所以这里400就是因为:分隔之后端口非数字,挂了,解析port代码如下

int port = 0;            int mult = 1;            for (int i = valueL - 1; i > colonPos; i--)            {                int charValue = HexUtils.getDec(valueB[i + valueS]);                if (charValue == -1 || charValue > 9)                {                    // Invalid character                    // 400 - Bad request                    response.setStatus(400);                    setErrorState(ErrorState.CLOSE_CLEAN, null);                    break;                }                port = port + (charValue * mult);                mult = 10 * mult;            }
Host头,是http协议中唯一要求必填的头,为什么呢?以tomcat为例,假设有2个应用位于webapps下分别为baidu和alibaba,在server.xml配置2个Host,而且appBase都是webapps,那么ip和端口都是一样的,到达tomcat后应该给哪个应用呢?这时候可不就得依赖于Host头了吗

转载地址:http://wmcqb.baihongyu.com/

你可能感兴趣的文章
中文版Windows XP 的新增功能(转)
查看>>
Web Application 開 發 利 器 - WebSnap(三) (转)
查看>>
跟我学 安装Windows Vista Bata2实录(转)
查看>>
Windows Vista IIS 7.0开启方法(转)
查看>>
Windows Vista六大版本详细介绍(转)
查看>>
Windows XP 中注册表内容的导入和导出(转)
查看>>
正版风暴让盖茨命不盖绝 Linux祸福难料(转)
查看>>
单一产品不会成功 开源软件开始商业应用(转)
查看>>
RedHat上SSH2的安装和使用(转)
查看>>
安全使用RedHat Linux系统(转)
查看>>
RedHat Enterprise AS4硬盘安装步骤(转)
查看>>
全国第一个高校Linux培训考试中心建立(转)
查看>>
Linux黑客大曝光:Linux安全机密与解决方案(转)
查看>>
关于Kerberos安装的几个问题(转)
查看>>
Solaris硬盘分区简介(转)
查看>>
gcc编译器小知识FAQ(转)
查看>>
Linux下多线程编程与信号处理易疏忽的一个例子(转)
查看>>
流氓和木马结合 强行关闭你的防火墙(转)
查看>>
SUSE一纸诉状控告SCO 捍卫知识产权(转)
查看>>
debian下编译2.6.13.2内核的步骤及感受(转)
查看>>