【问题标题】:how to avoid or handle request for `favicon.ico` from the browser for a servlet?如何避免或处理浏览器对 servlet 的“favicon.ico”请求?
【发布时间】:2017-12-08 16:12:59
【问题描述】:

更新: 即使正在为 favicon.ico 发送另一个请求并且函数正在再次执行(两个 console.log(data) 输出),为什么响应对象没有被发送两次?

另外,有没有办法不发送对 favcion.ico 的请求,因为我不希望我的函数无用地运行两次?


我创建了一个非常简单的 servlet 来接受 GET(默认)并在读取文件后将内容返回给浏览器

var http = require("http");
var fs = require("fs");
var num=0;

http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/plain'});
var data = '';
// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Set the encoding to be utf8. 
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function(){
console.log(data); //To print same file content in the console
response.end(data);
});

readerStream.on('error', function(err){
   console.log(err.stack);
   data+="\n\n"+err.stack;
});


}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

但是每次我运行这个 servlet 并在 http://localhost:/8081 发出请求时,我会在控制台上打印两次文件的内容,但在浏览器窗口中只打印一次(这是预期的行为)。

控制台行为的原因是什么?

另外,我修改了程序,添加了一个计数器来计算函数针对每个请求运行了多少次(对于consoleresponse,将值附加为data+num),发现它是two 但第一次执行函数的响应是浏览器收到的响应,而不是第二次响应(浏览器窗口打印 data+1 表示第一个请求)。

【问题讨论】:

  • 下一个请求打印 data 变量中的数据,并附加 3,然后是 5,依此类推...

标签: javascript node.js servlets


【解决方案1】:

例如,大多数浏览器都会调用抓取 /favicon.ico。

尝试记录 url,你可以看到被调用的内容。

console.log(req.url);

【讨论】:

  • 此外,从浏览器的网络选项卡中,您可以看到正在对 favicon.ico 进行的调用。
  • @JeremyThille 是的。&感谢您说得更清楚
  • 我不明白。显然,我的函数被执行了两次(因为正在调用 readerStream 的 on 事件的函数),因为 console.log(data) 被打印了两次。为什么请求没有从response.end 发送两次,因为它在同一个函数中??
  • 还有如何让我的浏览器不这样做?
【解决方案2】:

正如@sForSujit 所指出的,对于浏览器想要作为响应的每个页面,显然有两个请求 - 另一个是名为 favicon.ico 的文件,它是显示在页面标题旁边的图标文件浏览器标签。

这导致两个请求也被服务器捕获,这再次进行文件读取操作并第二次在控制台上打印出来。第二次响应对象在客户端被渲染为无用,因为它正在寻找您的 favicon.ico 文件作为响应对象。

它是如何获取的?

浏览器尝试通过首先从您的网页目录中请求“favicon.ico”来获取该图标。如果找不到这样的文件,它将尝试从您网站的根目录获取它,如果失败,它将简单地使用默认图标。

Chrome 在根目录中搜索 favicon.ico 文件。

Firefox 在每个页面上都需要这个:

<link rel="icon" type="image/png" href="/favicon.png" />

大多数(如果不是全部)现代浏览器也可以使用 favicon.ico 文件。事实上,他们中的许多人也接受其他图形格式的文件,例如 PNG 格式。

但是,这又需要为您希望在其中显示自定义网站图标的网站的每个网页进行设置。要知道如何解决这个问题,请阅读 SO 回答 here


如何避免 favico.ico 请求?

来自vog's的回答,

以下解决方案非常简短,有效的 HTML5 并且不会招致 IE 8 和更早版本的任何怪癖。

只需将以下行添加到 HTML 文件的部分:

<link rel="icon" href="data:,">

【讨论】:

    【解决方案3】:

    我发现这个有效的 URL 链接可以消除网站图标错误。

    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
    

    希望你觉得它有用。

    【讨论】:

    • 欢迎来到 SO!当您添加与之前的答案之一相似的答案时,请描述您的观点并揭示优缺点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多