版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/104819575
我是在整合 SSM 框架時發現的問題,這個問題以前我從沒深究過它 —— /
和 /*
的區別。
學過 Spring MVC 的小夥伴們肯定還記得,我們在配置 前端控制器 和 字符集過濾器 時,通常在 web.xml
中是這樣配置的:
<!-- 前端控制器 -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 字符集過濾器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
不知道大家有沒有發現,在 前端控制器 中 <url-pattern>
配置的是 /
,將攔截所有請求;字符集過濾器 中 <url-pattern>
配置的是 /*
,也將過濾所有請求。不細看的話,它們好像作用都一樣,那麼大家有沒有想過既然都是攔截或過濾所有請求,那麼爲什麼寫法會不同呢?
關於這個問題我在網上查了很多資料,基本上他們的回答要麼抄襲要麼回答不全面,或者有人都不屑回答這樣問題(他們認爲沒有必須研究這個問題),經過我認真的推敲,有些人的答案還是可以借鑑的。
這個問題我們可以回到最原始的 Servlet 和 Filter,因爲 前端控制器 就是一個 Servlet,字符集過濾器 就是一個 Filter,我從這方面下手,嘗試寫了幾個 Demo,發現其實 /
和 /*
分別在 Servlet 和 Filter 中有不同的意義。並得出下列 結論:
1、Servlet
-
/
:它會匹配所有的路徑,但是不會匹配到像.jsp
這樣的頁面。如:- http://localhost:8080/webdemo/hello(會匹配);
- http://localhost:8080/webdemo/hello/abc(會匹配);
- http://localhost:8080/webdemo/hello/world.html(不會匹配)。
你會發現只要後面有
.xxx
都不會被匹配到。 -
/*
:它會匹配所有的路徑和頁面,上述的例子均會被匹配到。
2、Filter
/
:它會過濾根目錄,而且只會過濾根目錄,不會過濾其他路徑;/*
:它會過濾全部請求,也包括根目錄。