【问题标题】:Browser sending Empty Request to own Server浏览器向自己的服务器发送空请求
【发布时间】:2021-03-30 20:24:39
【问题描述】:

我最近一直在用 Java 编写自己的 Web 服务器,因为我认为拥有一个 Web 服务器很整洁,昨天我偶然发现了一个我仍然没有解决的问题。 我的浏览器(未使用谷歌搜索的 Chromium)似乎向服务器发送了一些空请求或类似的东西。 我已经实现了一个请求处理程序,它应该读取 GET 请求并提取请求的资源。 它的工作原理是这样的:它以请求为例:“GET /index.html HTTP/1.1”并将其与 String.split(" ");方法数组然后看起来像这样:[“GET”,“/index.html”,“HTTP/1.1”] 然后我将数组的第二个值(在本例中为“/index.html”)存储在一个变量中,然后我可以使用该变量来定位请求的文件并将其提供给用户。 出于调试目的,我还会打印出用户发送的完整请求,如下所示

GET、/index.html、HTTP/1.1 主机:,本地主机:8080 连接:,保持活动 缓存控制:, max-age=0 升级不安全请求:, 1 DNT:, 1 User-Agent:, Mozilla/5.0, (X11;, Linux, x86_64), AppleWebKit/537.36, (KHTML,, like, Gecko), Chrome/86.0.4240.111, Safari/537.36 接受:, text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-交换;v=b3;q=0.9 Sec-Fetch-Site:, 同源 Sec-Fetch-Mode:, 导航 Sec-Fetch-Dest:, 文档 引用者:,http://localhost:8080/index.html Accept-Encoding:, gzip,, deflate,, br Accept-Language:, en-US,en;q=0.9

但是,有时请求只是空的,它打印出来的正是这个:[] 然后它显然会抛出一个 ArrayIndexOutOfBoundsException 。 这很烦人,因为它与 Linux“curl”命令(curl localhost:8080/index.html)完美配合 我已经尝试通过使用wireshark并寻找一些奇怪的东西来解决这个问题,但是我解决这个问题的尝试都没有奏效。 我希望我能为任何人提供足够的信息来帮助我解决我的问题,我已经尝试解决这个问题两天了,如果有人帮助我,我将非常感激。 谢谢

抱歉,文本格式不佳,这是我的第一个 stackoverflow 问题

【问题讨论】:

  • 从请求中读取的数据是什么?这提供了比拆分结果更多的信息。

标签: java http browser server


【解决方案1】:
if (!request.trim().isEmpty())
{
   String[] requestArray= request.split(" ");
   if (requestArray.length > 1)
   {  
      //your logic as usual
   }
   else
   {
       log.error("The request has an incorrect format: "+request);
       //...
   }
}
/*else
{
   log.error("The request is empty");
   //...
}  uncomment this only if needed, as you could get spammed by empty requests */ 

首先验证request 字符串。如果为空,则避免处理,无需拆分。修剪将删除前导/尾随空格。

然后验证 split() 方法的结果,并将您的逻辑放在该块中。如果条件不成立,请避免处理。

【讨论】:

  • 问题是你可能会碰到一个没有元素的数组,因为 split() 不返回任何东西,或者可能只返回一个元素。关键是通过首先验证请求字符串来避免这种情况
  • 你的解决方案会让浏览器的垃圾请求越来越多,首先它会说“格式不正确”,然后它只会发送垃圾邮件“空请求”
  • 不,只会执行其中一个。如果为空,则为“空请求”。如果不是空的但格式无效,“格式不正确”。但两者都不会显示,因为“格式不正确”的日志必须通过第一个过滤器。如果是这样,这意味着保存空请求逻辑的 else 块将永远不会被执行,因为请求不是空的
  • 它们是两个不同的错误,永远不会一起显示;如果“请求的格式不正确”块被执行,流程将继续而不执行最后一个“else”块-->如果您显示的格式不正确,这意味着请求不是空的
  • 它实际上已经修复了,我想,非常感谢你的帮助,你拯救了我的一天!! (或者我的夜晚,因为它对我来说是 3:50 xd)我什至不能感谢你!你真棒
猜你喜欢
  • 2013-08-13
  • 2019-03-30
  • 2013-08-01
  • 2018-09-17
  • 1970-01-01
  • 2021-07-15
  • 2018-01-18
  • 2022-01-12
  • 1970-01-01
相关资源
最近更新 更多