問題:在使用了MVC攔截器時,訪問除登錄頁面以外的URL時,判斷是否登錄,未登錄的訪問全部跳轉至登錄界面,但是在設置好時,是會判斷並跳轉,但是在起初,未登錄訪問,會先進入訪問的資源頁面后,立即閃退去登錄頁面。
但是明顯這種狀況是不滿足權限攔截需求的,是錯誤操作。
原因就在於一開始在web.xml中配置了 default默認servlet 然后對 *.html 資源的放行(因為不配無法訪問到html資源。)
在web.xml文件中經常看到這樣的配置<servlet-name>default</servlet-name>,這個配置的作用是:對客戶端請求的靜態資源如圖片、JS文件等的請求交由 默認的servlet進行處理,如下所示:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ico</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
如何你的DispatcherServlet攔截"*.do"這樣的有后綴的URL,就不存在訪問不到靜態資源的問題。
如果你的DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那么同時對*.js,*.jpg,*.html等靜態文件的訪問也就被攔截了。
即使你之后在mvc的攔截器中進行了部分資源的放行也依舊無法訪問靜態資源,因為你訪問靜態資源時DispatcherServlet會將你的請求先攔截,放行后返回瀏覽器的依舊是/***.html,會再次訪問,然后又進DispatcherServlet,如此循環。
所以,default默認servlet的配置還是必須的。
於是問題就產生了,下面是我開始的配置(web.xml中):
<!--避免springmvc攔截以html結尾的請求-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
但是,這樣雖然表面上的功能都實現了,卻會出現開始闡述的問題,沒登錄還是能有一瞬間看到被攔截的資源。
解決方式很簡單,在web.xml刪除上面的配置,將 該默認servlet配置 移到mvc的配置文件中配置,如下:
<!-- 配置靜態資源 默認servlet配置 允許使用"/"做整體映射 等-->
<mvc:default-servlet-handler />
重新運行,問題解決,不會再進入被攔截頁面后又閃跳會登錄界面了。