自己在做作業的時候碰到在jsp裏導圖片無法正常顯示的情況,後來發現是自定義的interceptor對圖片進行了攔截,所以無法獲取到圖片
.xml文件裏的代碼
web.xml裏的部分配置信息(配置DispatcherServlet):
<!-- 配置Spring MVC前端核心控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!-- 配置服務器啓動後立即加載Spring MVC配置文件 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springmvc-config.xml裏的部分配置信息(配置靜態資源的訪問映射即不攔截靜態資源):
<!-- 配置靜態資源的訪問映射,此配置中的文件,將不被DispatcherServlet前端控制器攔截 -->
<mvc:resources location="/js/" mapping="/js/**" ></mvc:resources>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/fonts/" mapping="/fonts/**"></mvc:resources>
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
<!-- 配置登錄校驗攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.edu.bdu.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
原來經常這樣配置,所以覺得靜態資源都放行了,但是經過多次實驗還是被攔截了,所以我懷疑是攔截器給攔掉了,對攔截器配置進行修改
第一種方法:在攔截器裏配置不需要攔截的資源路徑(我的是圖片)
<!-- 配置登錄校驗攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<!-- 增加的信息 /start -->
<mvc:exclude-mapping path="/**/*.png"/>
<mvc:exclude-mapping path="/**/*.gif"/>
<mvc:exclude-mapping path="/**/*.jpg"/>
<!-- 增加的信息 /end -->
<bean class="com.edu.bdu.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
第二種方法:在web.xml中配置默認攔截器,不攔截靜態資源
用這種方法的話需要在web.xml裏添加servlet-mapping
<!-- 不對靜態文件攔截 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/js/*</url-pattern>
<url-pattern>/css/*</url-pattern>
<url-pattern>/fonts/*</url-pattern>
<url-pattern>/images/*</url-pattern>
</servlet-mapping>
springmvc-config.xml裏添加<mvc:default-servlet-handler />(我用的tomcat默認servlet名字是default)
<mvc:default-servlet-handler default-servlet-name="default"/>
用這種方法配置那麼<mvc:resources>也就不要了,攔截器裏也不用寫<mvc:exclude-mapping>了
第三種方法:在web.xml中配置特定的<url-pattern>
<!-- 配置Spring MVC前端核心控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<!-- 配置服務器啓動後立即加載Spring MVC配置文件 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
用這種方法,spring攔截的時候只攔截 “.action” 結尾的請求,就無關於靜態資源的維護了。
<mvc:resources>也就不要了,攔截器裏也不用寫<mvc:exclude-mapping>了
當DispatcherServlet請求映射配置爲"/"時,Spring MVC將捕獲Web容器所有的請求,包括靜態資源的請求,Spring MVC會將它們當成一個普通請求處理,導致找不到對應處理器造成錯誤。