【1】設定預設Servlet
即将DispatcherServlet請求映射設定為
/
,将會攔截所有的請求。注意哦,有可能不能通路靜态資源。
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
① <mvc:default-servlet-handler/>
<mvc:default-servlet-handler/>
通常在SpringMVC的配置檔案中配置如下标簽配套使用(解決靜态資源不能通路問題)
<mvc:default-servlet-handler/>
其XSD文檔說明如下:
解釋如下:
<mvc:default-servlet-handler/>
将在SpringMVC的上下文中定義一個
DefaultServletHttpRequestHandler
來處理靜态資源(其實就是将請求轉發給預設的servlet)。
配置一個handler通過轉發請求到Servlet 容器的預設servlet來處理靜态資源。使用該handler将會允許
DispatcherServlet
的
url-pattern
為
'/'
;同時使用Servlet 容器的預設servlet處理靜态資源。該handler将會轉發所有請求到預設servlet。是以将該handler的執行順序放到所有請求處理的最後是非常重要的。如果您使用“
annotation driven
”标簽,或者設定自定義
HandlerMapping
執行個體,則會出現這種情況。請確定将其“order”屬性設定為低于
DefaultServletHttpRequestHandler
的值,即
Integer.MAX_VALUE
。
一般WEB伺服器預設的
servlet
的名稱為
default
。若所使用的WEB伺服器預設的Servlet名稱不是default,則需要通過
default-servlet-name
屬性指定!
不同伺服器下預設servlet名字
Tomcat, Jetty, JBoss, and GlassFish 預設 Servlet的名字 -- "default"
Google App Engine 預設 Servlet的名字 -- "_ah_default"
Resin 預設 Servlet的名字 -- "resin-file"
WebLogic 預設 Servlet的名字 -- "FileServlet"
WebSphere 預設 Servlet的名字 -- "SimpleFileServlet"
② Controller跳轉失效
使用上述配置,你會發現正常的Controller跳轉失效了!
XSD說明最後一段話說明,要麼配置
<mvc:annotation-driven />
标簽,要麼手動注冊請求映射處理bean于xml中,并設定order屬性值小于DefaultServletHttpRequestHandler的order屬性值!
常用的解決方式為配置
<mvc:annotation-driven />
标簽,詳情點選檢視請求映射失效。
【2】url-pattern設定為*.do
解決靜态資源的思路是,在SpringMVC.xml中,攔截設定為
"*.do"
,而不是
"/"
。這樣就不會攔截靜态資源的請求。
需要注意的是,如果項目中用到了shiro或者其他權限架構。那麼需要注意你的shiro.xml配置,示例如下:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- Shiro的核心安全接口,這個屬性是必須的 -->
<property name="securityManager" ref="securityManager"/>
<!-- loginUrl認證送出位址,如果沒有認證将會請求此位址進行認證,請求此位址将由formAuthenticationFilter進行表單認證 -->
<property name="loginUrl" value="/login"/>
<!-- Shiro連接配接限制配置,即過濾鍊的定義 -->
<property name="filterChainDefinitions">
<value>
<!-- /** = anon所有url都可以匿名通路 -->
<!-- 對靜态資源設定匿名通路 -->
/images/** = anon
/js/** = anon
/styles/** = anon
<!-- 驗證碼,可匿名通路 -->
/validateCode = anon <!--驗證碼-->
/doLogin = anon
<!-- /** = authc 所有url都必須認證通過才可以通路 -->
/**=authc
<!--請求logout,shrio擦除sssion-->
/logout=logout
</value>
</property>
</bean>
需要注意的是雖然SpringMVC攔截的是
.do
,但是由于使用了shiro(或者你的其他權限架構),那麼未登入情況下是不能直接通路除shiro配置檔案裡面允許匿名通路的路徑之外的靜态資源檔案。
舉個例子,你把靜态資源檔案放在了項目根目錄,但是參考上面配置檔案,顯然不在匿名通路路徑清單之内,是以會提示你先登入,登入之後才可通路項目根目錄的靜态資源檔案。
未登入前通路項目根目錄下1.jpg , 跳到登入頁面:
登入後通路項目根目錄下1.jpg :
另外,建議最好參考shiro配置檔案,比如1.jpg放到images檔案夾下,那麼不用登入就可以直接通路。
【3】
通過配置,避免靜态資源被攔截
<!-- 靜态資源通路(不攔截此目錄下的東西的通路) -->
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/bootstrap/" mapping="/bootstrap/**"/>
該标簽的xsd說明文檔如下:
- 配置一個處理程式,用于為靜态資源(如圖像、js和css檔案)提供服務,并使用優化的緩存頭在web浏覽器中高效加載。
- 允許在通過Spring的資源處理可以通路的任何路徑之外提供資源。
注冊的handler如下:
org.springframework.web.servlet.resource.ResourceHttpRequestHandler
即,該标簽注冊ResourceHttpRequestHandler為靜态資源的通路提供服務。
【4】
确切說這裡隻解決不通過controller而直接通路jsp的問題。
<mvc:view-controller/>
直接通路view-name對應的jsp
<!-- mvc:view-controller可使其直接通路路徑 -->
<mvc:view-controller path="/i18n" view-name="i18n"/>
<mvc:view-controller path="/i18n2" view-name="i18n2"/>
【5】在web.xml中作手動配置default servlet映射
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</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>*.mp4</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>*.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>*.html</url-pattern>
</servlet-mapping>