SpringMVC - 配置不拦截静态资源

简介: SpringMVC - 配置不拦截静态资源

问题产生

因为我们在web.xml中写了 拦截所有请求,当然包括了静态资源,所以页面需要引用css或js的话,该请求也会被拦截,例如:

image.png


在style.css中写一个简单样式,加个背景颜色

body{
    background-color: antiquewhite;
}

然后在index.jsp页面引用该样式:<link rel="stylesheet" href="/css/style.css">

再一次运行项目,会看到并没有样式,F12可以看到在调用style.css的时候报了404错误,这是因为被DispatcherServlet拦截了。


image.png


解决方案

方案一:拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml)

注意:需引入mvc命名空间

 <!-- 添加注解驱动 -->
<mvc:annotation-driven/>
<!--
    通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器
    设置不过滤内容,比如:css,js,img 等资源文件
    location指的是本地的真是路径,mapping指的是映射到的虚拟路径。
-->
<mvc:resources mapping="/css/**" location="/css/"/>

方案二:使用默认的servlet处理静态资源(涉及spring-mvc.xml,web.xml)

在spring-mvc.xml中添加:

<!--启用默认Servlet-->
<mvc:default-servlet-handler />

在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。


一般Web应用服务器默认的Servlet名称是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:


///

<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

另:在web.xml中添加(若要配合上面,需要重写;当然可以单独重写,即无需配合上面的配置“<mvc:default-servlet-handler />”):

<!--增加对静态资源的处理,当前的设置必须在Spring的Dispatcher的前面-->
<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>*.css</url-pattern>
  <url-pattern>/css/*</url-pattern>
</servlet-mapping>

方案三:修改spring的全局拦截设置为*.do的拦截(涉及web.xml)

<!-- 拦截所有请求 -->
<servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <!--<url-pattern>/</url-pattern>-->
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

这时,我们浏览器的所有访问路径就要变成:http://localhost:8080/xxx/xxx.do


总结

第一种方案配置比较臃肿,多个拦截器时增加文件行数,不推荐使用。

第二种方案使用默认的Servlet进行资源文件的访问,Spring拦截所有请求,然后再将资源文件交由默认的Sevlet进行处理,性能上少有损耗。

第三种方案Spring只是处理以'.do'结尾的访问,性能上更加高效,但是再访问路径上必须都以'.do'结尾,URL不太文雅。

综上所述,推荐使用第二方案。


目录
相关文章
|
5月前
|
设计模式 前端开发 JavaScript
Spring MVC(一)【什么是Spring MVC】
Spring MVC(一)【什么是Spring MVC】
|
2月前
|
Java Apache vr&ar
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException:
springmvc报错 nested exception is org.mybatis.spring.MyBatisSystemException:
16 0
|
7月前
|
前端开发 Java Go
Spring MVC 和 Spring Boot 的区别
Spring MVC 和 Spring Boot 的区别
112 0
|
10月前
|
Java Spring
springmvc中spring提供的中文乱码解决问题
可以解决浏览器的乱码问题
44 0
|
5月前
|
设计模式 前端开发 Java
Spring Boot之Spring MVC的工作原理 以及使用eclipse开发Spring MVC的Web应用实战(附源码)
Spring Boot之Spring MVC的工作原理 以及使用eclipse开发Spring MVC的Web应用实战(附源码)
46 0
|
10月前
|
JSON 前端开发 Java
"《图书管理系统》利用SpringMvc$Spring$MyBatis (实操九)(一) "
"《图书管理系统》利用SpringMvc$Spring$MyBatis (实操九)(一) "
57 0
|
5月前
|
设计模式 前端开发 Java
8:Spring MVC-Java Spring
8:Spring MVC-Java Spring
72 0
|
9月前
|
前端开发 Java 应用服务中间件
SpringMVC(基于Spring 的Web 层MVC 框架)--SpingMVC 执行流程--@RequestMapping的使用
SpringMVC(基于Spring 的Web 层MVC 框架)--SpingMVC 执行流程--@RequestMapping的使用
99 0
|
10月前
|
SQL JSON 前端开发
SpringMvc+Spring+MyBatis+Maven+Ajax+Json注解开发 利用Maven的依赖导入不使用架包模式 (实操十二)
SpringMvc+Spring+MyBatis+Maven+Ajax+Json注解开发 利用Maven的依赖导入不使用架包模式 (实操十二)
44 0
|
10月前
|
Java 数据库连接 数据库
《图书管理系统》利用SpringMvc$Spring$MyBatis (实操九)(二)
《图书管理系统》利用SpringMvc$Spring$MyBatis (实操九)(二)
46 0