关于tomcat服务器启动,Filter过滤器实现类中的方法:doFilter()调用两次的原因

在测试过滤器的时候,设置过滤器对所有的请求都拦截,当idea启动服务器后,这里我设置的是当服务器启动,浏览器自动访问默认页面,也就是index.jsp页面,如下图:

 然后,惊奇地发现,doFilter()方法被调用了两次,为啥不是预料中的调用一次?

doFilter()方法的代码如下:

控制台输出如下:

先说下,我这里是利用注解进行测试的,我没生成web.xml文件,所以应该不会存在这个项目加载两次的原因,但为了证明不是项目被idea重复加载两次导致的,我在Filter的初始化方法init()中写了如下信息(后面我不用注解,我用web.xml配置,也出现了doFilter()方法调用两次的问题):

 如果控制台输出了两句这句话,就证明是这个web项目在idea中被加载了两次,所以默认访问index页面的请求也发了两次,这个也能解释为什么doFilter()方法会执行两次,但是,确实不是这个问题,控制台只输出了一次这句话

 这说明了项目只被加载了一次,是没有问题的。那么问题就应该出在:访问默认页面index.jsp页面的时候,发出了两次请求。但是,访问默认页面,按道理来讲应该只发了一次请求吧,那么另外一次请求是什么呢?我修改了一下doFilter()方法的代码,想要获取到请求的uri:

再次启动服务器,控制台输出如下:

 很失望,并没有得到想要的请求uri信息,第一个uri我是能理解的:因为服务器启动,默认访问根目录,就是在浏览器自动输入的这个路径。那第二个也是这个uri,这就说明了,在服务器启动,在自动发出访问index.jsp页面的时候,在这一次请求中,浏览器应该是发出了两次请求,并且路径都是一样的!

那么,隐藏的另外一次请求究竟是什么呢?我去参考了网上的解答,在发出请求的时候,浏览器自动发出一个/favicon.ico请求

关于这个请求的作用

 再查找资料,发现这是浏览器的一种机制,也就是说这是所有浏览器的一种默认行为,作用就是为了显示搜索栏中的图标

那么能不能禁止呢?这个我没深入研究,感兴趣的可以去百度一下或者查阅一下资料,应该有禁止的方法的。但是doFilter()方法为什么执行了两次,原因也就找到了。

但是呢,浏览器也不是每次请求都会自动加上/favicon.ico请求的,如果我不勾选:在浏览器启动完毕后,手动输入url访问默认页面,就不会发送/favicon.ico请求:

也就是说如果手动输入url的话,doFilter()是不会执行两

至此,doFilter()方法在服务器启动时被调用两次的原因就找到了。

参考网友解答地址:

https://blog.csdn.net/weixin_33895016/article/details/92425764

原文地址:https://www.cnblogs.com/ljfsmile0613/p/13485279.html