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
相关产品推荐
相关产品推荐

