配置servlet時/和/*的區別
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- Spring MVC Servlet -->
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
此處需要特別強調的是 <url-pattern>/</url-pattern>使用的是/,而不是/*,如果使用/*,那麼請求時可以通過DispatcherServlet轉發到相應的Action或者Controller中的,但是返回的內容,如返回的jsp還會再次被攔截,這樣導致
二、其實Spring 的Servlet攔截器匹配規則(即 <url-pattern>...</url-pattern> )都可以自己定義,例:當對映為@RequestMapping("/user/add")時
1、攔截*.do、*.htm, 例如:/user/add.do
這是最傳統的方式,最簡單也最實用。不會導致靜態檔案(jpg,js,css)被攔截。
2、攔截/,例如:/user/add
可以實現現在很流行的REST風格。很多網際網路型別的應用很喜歡這種風格的URL。
弊端:會導致靜態檔案(jpg,js,css)被攔截後不能正常顯示。想實現REST風格,事情就是麻煩一些。後面有解決辦法還算簡單。
3、攔截/*,這是一個錯誤的方式,請求可以走到Action中,但轉到jsp時再次被攔截,不能訪問到jsp。
三、如何訪問到靜態的檔案,如jpg,js,css?
如果你的DispatcherServlet攔截"*.do"這樣的有後綴的URL,就不存在訪問不到靜態資源的問題。
如果你的DispatcherServlet攔截"/",為了實現REST風格,攔截了所有的請求,那麼同時對*.js,*.jpg等靜態檔案的訪問也就被攔截了。
我們要解決這個問題。
目的:可以正常訪問靜態檔案,不可以找不到靜態檔案報404。
方案一:啟用Tomcat的defaultServlet來處理靜態檔案
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</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>
特點:1. 要配置多個,每種檔案配置一個。
2. 要寫在DispatcherServlet的前面, 讓 defaultServlet先攔截請求,這樣請求就不會進入Spring了。
3. 高效能。
備註:
Tomcat, Jetty, JBoss, and GlassFish 自帶的預設Servlet的名字 -- "default"
Google App Engine 自帶的 預設Servlet的名字 -- "_ah_default"
Resin 自帶的 預設Servlet的名字 -- "resin-file"
WebLogic 自帶的 預設Servlet的名字 -- "FileServlet"
WebSphere 自帶的 預設Servlet的名字 -- "SimpleFileServlet"
方案二: 在spring3.0.4以後版本提供了mvc:resources , 使用方法:
<!-- 對靜態資原始檔的訪問 -->
<mvc:resources mapping="/images/**" location="/images/" />
images/**對映到 ResourceHttpRequestHandler進行處理,location指定靜態資源的位置.可以是web application根目錄下、jar包裡面,這樣可以把靜態資源壓縮到jar包中。cache-period 可以使得靜態資源進行web cache
如果出現下面的錯誤,可能是沒有配置<mvc:annotation-driven />的原因。
報錯WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'
使用<mvc:resources/>元素,把mapping的URI註冊到SimpleUrlHandlerMapping的urlMap中,
key為mapping的URI pattern值,而value為ResourceHttpRequestHandler,
這樣就巧妙的把對靜態資源的訪問由HandlerMapping轉到ResourceHttpRequestHandler處理並返回,所以就支援classpath目錄,jar包內靜態資源的訪問.
另外需要注意的一點是,不要對SimpleUrlHandlerMapping設定defaultHandler.因為對static uri的defaultHandler就是ResourceHttpRequestHandler,
否則無法處理static resources request.
方案三 ,使用<mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>
會把"/**" url,註冊到SimpleUrlHandlerMapping的urlMap中,把對靜態資源的訪問由HandlerMapping轉到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 處理並返回.
DefaultServletHttpRequestHandler使用就是各個Servlet容器自己的預設Servlet.
補充說明:多個HandlerMapping的執行順序問題:
DefaultAnnotationHandlerMapping的order屬性值是:0
< mvc:resources/ > 自動註冊的 SimpleUrlHandlerMapping 的order屬性值是: 2147483646
<mvc:default-servlet-handler/>自動註冊 的SimpleUrlHandlerMapping 的order屬性值是:
spring會先執行order值比較小的。當訪問一個a.jpg圖片檔案時,先通過 DefaultAnnotationHandlerMapping 來找處理器,一定是找不到的,因為我們沒有叫a.jpg的Action。然後再按order值升序找,由於最後一個 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定會匹配上,就可以響應圖片。 訪問一個圖片,還要走層層匹配。不知效能如何?
最後再說明一下,方案二、方案三 在訪問靜態資源時,如果有匹配的(近似)總攔截器,就會走攔截器。如果你在攔截中實現許可權檢查,要注意過濾這些對靜態檔案的請求。
如何你的DispatcherServlet攔截 *.do這樣的URL字尾,就不存上述問題了。還是有後綴方便。
相關推薦
配置servlet時/和/*的區別
我們都知道在基於Spring的Application中,需要在web.xml中增加下面類似的配置資訊: <listener> <listener-class> org.springframework.web.context.ContextLoaderListener &
web.xml中配置servlet時url-pattern標籤到底是幹什麼的
以前配置web.xml都是自動生成的,昨天寫一個關於使用servlet生成驗證碼的過程中,碰到了一個問題。 就是在 <servlet> <description>&l
spring mvc 配置servlet 時 url-pattern 為什麼配置 /* 不可以 而配置 / 則沒問題呢
我幫忙解答下吧 1、在tomcat\conf\web.xml中定義了 Java程式碼 <servlet> <servlet-name>default</servlet-name> <serv
mybatis mapper xml文件配置resultmap時,id行和result行有什麽區別?
什麽 column invoice 配置 app nbsp ava customer entity mybatis mapper xml文件配置resultmap時,id行和result行有什麽區別? <resultMap id = "CashInvoiceMap"
c89和c99中/運算符和%運算符為負數時的區別
區別 str tro c99 根據 負數 cpu strong 除法 運算式 -8 / 5 = -1.6,在C89中取值為 -1 或 -2,C99的出現,CPU對除法的結果向零取整,上述運算式結果為 -1。 在C89和C99中都要確保 (a / b) * b + a % b
Spring MVC的default-servlet-handler和annotation-driven配置
spring mvc serlvet 使用spring通常配置url-pattern為/時,會代替web服務器的servlet成為default servlet,靜態資源無法訪問,添加<mvc:default-servlet-handler/>指定web服務器的servlet為defa
javax.servlet-api-xx.jar和servlet-api.jar區別
tom 查詢 識別 兩個 servle src com 版本 .com 一、簡介支持servlet的jar包。應該叫servlet-api.jar如果編寫過servlet就知道要用到HttpServletRequest和HttpServletResponse等對象,這些對象
nginx的location配置root、alias用法和區別
必須 del 實例 解釋 一個 clas 指定 不同的 否則 root & alias區別root與alias主要區別在於nginx如何解釋location後面的uri,這會使兩者分別以不同的方式將請求映射到服務器文件上root的處理結果是:root路徑+loca
applicationContext-XXX.xml和XXX-servlet.xml的區別
IT xxx bottom pat 官網 轉發 ota sca AC 1.ApplicationContext.xml 是spring 全局配置文件,用來控制spring 特性的 2.dispatcher-servlet.xml 是spring mvc裏面的,控制器、攔
ftp的主動模式和被動模式的配置和區別
ive line ip 地址 也會 邊界 操作模式 技術分享 上進 text 原文鏈接: https://blog.csdn.net/zhangyuan12805/article/details/71425385 ftp模式分為主動模式(active mode)和
關於iphone設置顯示模式為標準模式和放大模式時的區別
設置 sca style cal ins main pan 我不 spa 參考來自:https://www.jianshu.com/p/5f61d914114b CGFloat scale = [[UIScreen mainScreen] scale]; CGFloat
nginx代理配置 配置中的靜態資源配置,root 和 alias的區別。啟動註意事項
一閃而過 靜態資源 分享圖片 ali 後臺 nginx代理 消失 pac font 這篇主要內容是:nginx代理配置 配置中的靜態資源配置,root 和 alias的區別。啟動註意事項! 為什麽會在window上配置了nginx呢?最近我們的項目是靜態資源單獨放在一個
配置MySQL時,遇到的一些問題和解決方法
Q1.配置好路徑和環境變數以後,準備安裝mysql,但是顯示MySQL服務無法啟動 A:網上查了好多解決辦法,最後解決辦法是需要初始化,操作步驟為: mysql -remove mysql -install mysql -initialize Q2.正常啟動mysql後,輸入
第5章:作為Web應用:屬性和監聽者/5.3 Servlet屬性和引數的區別
Servlet屬性和引數的區別 型別: 屬性: 上下文屬性 請求屬性 會話屬性 引數: 上下文引數 Sevlet初始化引數 請求引
AndroidStudio2.2 Preview3中NDK開發之CMake和傳統 JNI在目錄結構和配置檔案上的區別
自從AndroidStudio更新到2.2,就有了CMake和傳統JNI兩種開發NDK的方法,主要就是在目錄結構和build.gradle上的區別,下面我們將分別介紹目錄區別和build.gradle種配置的區別(提示:在第一次用CMake時,最好在新建專案時勾選Include C++
web.xml 中spring-servlet.xml 和 application.xml 配置位置及含義
在我們進行 Spring-servlet 進行開發的時候,經常會遇到配置檔案配置的問題,要徹底的解決這個問題,我們需要了解 springMVC 設計的基本架構 1.SpringMVC 的配置分為兩部分 application.xml 和 spring-servl
被動埠配置實驗 ---rip和ospf協議下的區別
被動介面是為了防止其他路由器動態學習到本路由器上的路由資訊,設定本路由器的介面為Passive-interface,不允許路由更新報文從該路由器介面傳送出去。 Rip協議下的被動介面測試驗證,RIP中設定被動介面後,該介面不傳送更新報文,但是可以接受更新報文。 Osp
related、relative和relevant表示相關意思時的區別
相同點:均有相關的意思。 不同點: 單詞 英英 解釋 related 1.connected by kinship, common origin, or marriage 2.being connected either
related、relative和relevant表示相關意思時的區別例題答案
Peter asked his assistant to bring all relevant documents to tomorrow’s court hearing. The po
Gradle配置中subprojects 和 allprojects 的區別
subprojects 和 allprojects 的區別,先給出結論,然後通過一個例子來佐證結論。 結論:allprojects是對所有project的配置,包括Root Project。而subprojects是對所有Child Project的配置 舉個例子: 新建