在測試過濾器的時候,設置過濾器對所有的請求都攔截,當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