Spring MVC靜態資源攔截(No mapping found for HTTP request with URI in DispatcherServlet with name ' ')問題

衣舞晨風發表於2016-08-17

程式載入或用瀏覽器訪問靜態資源時出現以下的警告:

No mapping found for HTTP request with URI [/] in DispatcherServlet with name ”

問題原因:預設的訪問的URL都會被DispatcherServlet所攔截,從web.xml下對spring mvc的DispatcherServlet請求url對映的配置可以看出,具體配置如下:

<servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/application.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
<url-pattern>/</url-pattern>

url-pattern使用的是/,而不是/,如果使用/,那麼請求時可以通過DispatcherServlet轉發到相應的Action或者Controller中的,但是返回的內容,如返回的jsp還會再次被攔截,這樣導致404錯誤,即訪問不到jsp。所以如果以後發現總是有404錯誤的時候,別忘了check一下 url-pattern的配置是否是/*.

那麼如何訪問自己需要的靜態資原始檔呢?
解決方案一(告訴spring 靜態資源的處理方式):

 <mvc:resources location="/resources/" mapping="/resources/**"/>

解決方案二:

<servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/application.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>/.jsp</url-pattern>
    </servlet-mapping>

告訴spring mvc只攔截對於某一類檔案的請求,比如上面配置的只攔截對於字尾為jsp檔案的訪問。
解決方案三:

    <servlet>
        <servlet-name>hello-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/application.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>

告訴spring mvc 對於字尾為js的檔案是可以訪問的。依次類推,需要訪問其他資原始檔時可以通過servlet-mapping追加。

作者:jiankunking 出處:http://blog.csdn.net/jiankunking

相關文章