You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat中访问根路径时Servlet的doGet方法被触发两次的问题

Servlet访问根路径时控制台重复输出"Hello"问题排查

问题描述

我编写了一个仅向控制台输出消息的Servlet,部署在Tomcat 9.0.80上,代码如下:

@WebServlet("/")
public class HomeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello");
    }
}

当我在浏览器中访问根路径"/"时,控制台会两次输出"Hello"。我尝试过不同浏览器,仅Safari表现正常,甚至重装系统也无法解决问题,请问这是什么原因?

原因分析与解决办法

核心原因

大部分浏览器(Chrome、Firefox等)在访问网站根路径时,会自动发起额外的/favicon.ico请求,用于获取网站图标。由于你的Servlet映射的是根路径"/",这个图标请求也会被HomeServlet处理,导致doGet方法被调用两次,从而输出两次"Hello"。Safari没有这个自动请求行为,所以表现正常。

验证方式

可以修改doGet方法,打印请求的URI来确认:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("Hello from URI: " + req.getRequestURI());
}

运行后控制台会输出两条日志,分别对应"/"和"/favicon.ico"的请求。

解决办法

  • 指定具体映射路径:把Servlet的映射改为更具体的路径,比如@WebServlet("/home"),这样只有访问/home时才会触发你的Servlet,浏览器请求/favicon.ico时会由Tomcat默认逻辑处理。
  • 过滤图标请求:在doGet方法中判断请求URI,若为/favicon.ico则直接返回:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    if ("/favicon.ico".equals(req.getRequestURI())) {
        return;
    }
    System.out.println("Hello");
}
  • 添加真实图标文件:在项目的webapp目录下放置一个favicon.ico文件,浏览器会直接请求该静态文件,不会触发你的Servlet(需确保Tomcat静态资源处理配置正常)。

内容的提问来源于stack exchange,提问作者MArkal Moiseenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:42:10