在SpringMVC中,是通过前端分发器也就是DispatchServlet来进行我们的请求拦截的,所以如果我们的请求拦截的地址如果是类似于*.do,*.action的话,那么我们的js、png、css就可以逃过,因此是可以访问到的,可是如果我们配置的拦截地址是/,那么将会拦截我们所有的请求信息。那么如何来解决这个问题呢?
第一种方式
在一些常见的服务器中都有一些处理静态资源的Servlet,如下所示
Tomcat, Jetty, JBoss, and GlassFish 默认 Servlet的名字 -- "default"
Google App Engine 默认 Servlet的名字 -- "_ah_default"
Resin 默认 Servlet的名字 -- "resin-file"
WebLogic 默认 Servlet的名字 -- "FileServlet"
WebSphere 默认 Servlet的名字 -- "SimpleFileServlet"
因此我们可以在SpringMVC的dispatchServlet之前就通过服务器默认的拦截器来拦截这些URL,配置的时候,需要把这些URL-PATTERN放置到dispatchServlet之前,下面的操作需要配置到web.xml中
<span style="font-family:Comic Sans MS;font-size:18px;"><!-- 激活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></span>
通过这种方式就可以直接访问到我们所需要的js、css等文件了
第二种方式
直接使用使用<mvc:default-servlet-handler/>标签,配置到**-servlet.xml中即可,就可以访问到js、png文件了
第三种方式
在spring3.0.4以后版本提供了mvc:resources
<mvc:resources mapping="/style/**" location="/style/" />
上述的配置location,表示项目中的实际路径,而mapping表示映射的路径
上述配置就把项目根目录下的style文件夹以及style文件夹一下的所有的子文件当作静态资源,映射到项目根目录/style文件夹下
后面的location表示映射的路径,再举一个例子,比如项目中的js文件的实际位置是项目名/style/js/login.js,如果采用下面这种配置
<mvc:resources mapping="/dd/**" location="/style/" />
意思是把我们style的路径映射成为了dd,所以如果访问js文件的话需要,采用这个路径http://localhost:8080/SpringTest/dd/js/login.js
如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。
报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'
那么问题就来了,如果新增加一个目录的话,需要多加一条配置,因此可以采用后缀过滤操作,如下所示
<mvc:resources location="/" mapping="/**/*.html" />
<mvc:resources location="/" mapping="/**/*.js" />
<mvc:resources location="/" mapping="/**/*.css" />
<mvc:resources location="/" mapping="/**/*.png" />
<mvc:resources location="/" mapping="/**/*.gif" />
第四种方式
如果项目中采用了拦截器的操作,那么如何在拦截器中排除我们的js文件呢?如下所示
在dispatchServlet.xml文件中增加
<mvc:resources location="/WEB-INF/resource/" mapping="/resource/**"/>
该方式虽然静态资源文件可以访问了,但是如果系统配置了通配符的拦截器,静态资源还是会被拦截器拦截,如下:
1
2
3
4
5
6
|
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path= "/*" />
<bean class = "com.xinlong.cms.front.interceptor.CmsFrontInterceptor" ></bean>
</mvc:interceptor>
</mvc:interceptors>
|
因此需要修改,如下:
1
2
3
4
5
6
7
|
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path= "/*" />
<mvc:exclude-mapping path= "/resource/**" />
<bean class = "com.xinlong.cms.front.interceptor.CmsFrontInterceptor" ></bean>
</mvc:interceptor>
</mvc:interceptors>
|
到此还有个问题mvc:exclude-mapping 标签不被spring-mvc-3.0.xsd支持,该配置在spring-mvc-3.2.xsd中,可以通过http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd获取,因此需要在spring-mvc-3.0.xsd文件中增加该标签,处理办法很简单,从网上下载spring-mvc-3.2.xsd,找到标签后,再找到spring.web.servlet-3.0.5.jar中的spring-mvc-3.0.xsd文件,将标签加入即可