HTTP400错误和URLEncode

今天被URLEncode坑得报了一整天的HTTP400错误,特此总结一下。

1. URLEncode

1.1. 什么是URLEncode

百分号编码(Percent-encoding), 也称作URL编码(URL encoding), 是一种URL编码机制。

常用的以下几种编码规则:

  • 把URL中下图中上一行的字符(保留字符)转换为对应的下一行字符(非保留字符):

  • 把URL中的『%』转换为『%25』。 也因而对同一串URL多次进行URL编码会导致其长度会越来越长。如,

http://www.163.com -> http%3a%2f%2fwww.163.com -> http%253a%252f%252fwww.163.com -> ...

我们可以在这个网站进行测试。

  • 二进制数据每8个bite进行URL编码。 如字节值0F编码为「%0F」。

1.2. 什么时候会进行URLEncode

  • 在『Chrome的地址栏』和输入URL后,他会对URL中『http://』 之后的部分进行隐式的URL编码;
  • 在『Postman的地址栏』也会对URL中『http://』 之后的部分进行隐式的URL编码;『Postman的Params栏』则会全部进行URL编码;

这些过程都是透明的。另外,如果在地址栏中输入的URL是自行编码过的URL,它们就不会在对你的URL进行隐式的URL编码,非常的智能!

1.3. 什么时候会进行URLDecode

  • Java容器(如Tomcat、Resin等)在收到客户端的消息时,会隐式的进行一次URLDecode,这个过程也是透明的;
  • 可以在程序中手动进行字符串URLDecode。

2. HTTP 400错误

2.1. 什么是HTTP 400错误

400 Bad Request
由于包含语法错误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。

2.2. 什么时候会出现400错误

我们上面讲了URLEncode,当一个URL进行多次URLEncode时,Tomcat只URLDecode一次,这时就会返回400错误。这也是今天遇到的问题。

3. 参考

百分号编码

HTTP状态码

/** * RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS. * LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/ /* var disqus_config = function () { this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable }; */ (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://chenzz.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })();