springmvc静态资源访问

  问题:DispatcherServlet请求映射设置为 / ,将会拦截所有的请求。不能访问静态资源

  解决一:

           SpringMVC的配置文件中配置如下标签解决

<mvc:default-servlet-handler/>
View Code

  解释:

/*配置一个handler通过转发请求到servlet容器的默认servlet来处理静态资源*/
Configures a handler for serving static resources by forwarding to the Servlet container's default Servlet.

/*使用该handler将会允许DispatcherServlet 的url-pattern为'/';同时使用servlet容器的默认servlet处理静态资源*/
Use of this handler allows using a "/" mapping with the DispatcherServlet 
while still utilizing the Servlet container to serve static resources. 

/*该handler将会转发所有请求到默认servlet*/
This handler will forward all requests to the default Servlet. 

/*因此将该handler的执行顺序放到所有请求处理的最后是非常重要的!!!*/
Therefore it is important that it remains last in the order of all other URL HandlerMappings. 

/*使用<mvc:annotation-driven/>标签或者设置HandlerMapping instance的order来确保DefaultServletHttpRequestHandler的order最大。*/
That will be the case if you use the "annotation-driven" element 
or alternatively if you are setting up your customized HandlerMapping instance 
be sure to set its "order" property to a value lower than 
that of the DefaultServletHttpRequestHandler, which is Integer.MAX_VALUE.

    <mvc:default-servlet-handler/>将在SpringMVC的上下文中定义一个DefaultServletHttpRequestHandler来处理静态资源(其实就是将请求转发给默认的servlet)。

一般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跳转失效了!

/*使用<mvc:annotation-driven/>标签或者设置HandlerMapping instance的order来确保DefaultServletHttpRequestHandler的order最大。*/
That will be the case if you use the "annotation-driven" element 
or alternatively if you are setting up your customized HandlerMapping instance 
be sure to set its "order" property to a value lower than 
that of the DefaultServletHttpRequestHandler, which is Integer.MAX_VALUE.

      要么配置<mvc:annotation-driven />标签,要么手动注册请求映射处理bean于xml中,并设置order属性值,以其实现框架中处理请求映射的bean的order值小于DefaultServletHttpRequestHandler的order属性值

 

      解决二:

     避免静态资源被拦截,示例如下:

      /images /**映射到 ResourceHttpRequestHandler 进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period可以使得静态资源进行web cache

 <!-- 静态资源访问(不拦截此目录下的东西的访问) -->
    <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说明文档如下:

/*配置handler为静态资源,如images,js和CSS文件并进行缓存头优化,以便在Web浏览器中高效加载。*/
Configures a handler for serving static resources such as 
images, js, and, css files with cache headers optimized for efficient loading in a web browser. 
/*允许为任何可以通过spring处理的路径资源提供服务*/
Allows resources to be served out of any path that is reachable via Spring's Resource handling.

      注册的handler如下:

      org.springframework.web.servlet.resource.ResourceHttpRequestHandler

      该标签注册ResourceHttpRequestHandler为静态资源的访问提供服务。

 

     解决三:

     只解决不通过controller而直接访问jsp的问题

     <mvc:view-controller/>直接访问view-name对应的jsp

  • jsp路径依据视图解析器配置
<!-- mvc:view-controller可使其直接访问路径 -->  
    <mvc:view-controller path="/i18n" view-name="i18n"/>

    <mvc:view-controller path="/i18n2" view-name="i18n2"/>

 解决四:

  在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>

  

 

 

      

参考:

   https://blog.csdn.net/j080624/article/details/56839326

posted on 2018-09-15 18:22  溪水静幽  阅读(224)  评论(0)    收藏  举报