zoukankan      html  css  js  c++  java
  • 如何访问到静态的文件,如jpg,js,css?

    如果你的DispatcherServlet拦截"*.do"这样的有后缀的URL,就不存在访问不到静态资源的问题。

    如果你的DispatcherServlet拦截"/",为了实现REST风格,拦截了所有的请求,那么同时对*.js,*.jpg等静态文件的访问也就被拦截了。【目前项目大多是这样的】

    我们要解决这个问题。

    目的:可以正常访问静态文件,不可以找不到静态文件报404。

    这里要提醒一下:在WEB-INF中的静态文件怎么设置都是访问不到的。这里说的都是在WEB-INF外的静态文件,主要是是web-root下的。


    方案一:激活Tomcat的defaultServlet来处理静态文件【在tomcat/conf/web.xml文件里】

    1. <servlet-mapping>
    2. <servlet-name>default</servlet-name>
    3. <url-pattern>*.jpg</url-pattern>
    4. </servlet-mapping>
    5. <servlet-mapping>
    6. <servlet-name>default</servlet-name>
    7. <url-pattern>*.js</url-pattern>
    8. </servlet-mapping>
    9. <servlet-mapping>
    10. <servlet-name>default</servlet-name>
    11. <url-pattern>*.css</url-pattern>
    12. </servlet-mapping>
    13. 要配置多个,每种文件配置一个

    要写在DispatcherServlet的前面, 让defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。

     

    Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default"
    Google App Engine 自带的
    默认Servlet的名字 -- "_ah_default"
    Resin 自带的
    默认Servlet的名字 -- "resin-file"
    WebLogic自带的
    默认Servlet的名字 -- "FileServlet"
    WebSphere 自带的默认Servlet的名字 -- "SimpleFileServlet"


    方案二: 在spring3.0.4以后版本提供了mvc:resources , 使用方法:

    1. <!-- 对静态资源文件的访问 -->
    2. <mvc:resources mapping="/images/**" location="/images/" />

    /images/**这是访问的url,location是文件的位置,像上面配置的那样/images/仅仅是在根目录/images/下的图形文件有效。但是同时配置上方案三中的信息后,就都能访问到了。方案二和方案三,二优先级更高一些,先会处理。

    但是如果是配置成<mvc:resources mapping="/**" location="/" /> 没有方案三的情况下,无论访问的文件在哪里,只要不在WEB-INF里,都能访问到。
    /images/**映射到 ResourceHttpRequestHandler进行处理,location指定静态资源的位置.可以是web application根目录下、jar包里面,这样可以把静态资源压缩到jar包中。cache-period 可以使得静态资源进行web cache

    如果出现下面的错误,可能是没有配置<mvc:annotation-driven />的原因。
    报错WARNING: No mapping found for HTTP request with URI [/mvc/user/findUser/lisi/770] in DispatcherServlet with name 'springMVC'

    使用<mvc:resources/>元素,把mapping的URI注册到SimpleUrlHandlerMapping的urlMap中,
    key为mapping的URI pattern值,而value为ResourceHttpRequestHandler,
    这样就巧妙的把对静态资源的访问由HandlerMapping转到ResourceHttpRequestHandler处理并返回,所以就支持classpath目录,jar包内静态资源的访问.
    另外需要注意的一点是,不要对SimpleUrlHandlerMapping设置defaultHandler.因为对static uri的defaultHandler就是ResourceHttpRequestHandler,
    否则无法处理static resources request.

    方案三 ,使用<mvc:default-servlet-handler/>

    1. <mvc:default-servlet-handler/>

    会把"/**" url,注册到SimpleUrlHandlerMapping的urlMap中,把对静态资源的访问由HandlerMapping转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
    DefaultServletHttpRequestHandler使用就是各个Servlet容器自己的默认Servlet.

    补充说明:多个HandlerMapping的执行顺序问题:

    DefaultAnnotationHandlerMapping的order属性值是:0

    <mvc:resources/>自动注册的SimpleUrlHandlerMapping的order属性值是:2147483646

    <mvc:default-servlet-handler/>自动注册的SimpleUrlHandlerMapping的order属性值是:2147483647

    spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过 DefaultAnnotationHandlerMapping 来找处理器,一定是找不到的,因为我们没有叫a.jpg的Action。然后再按order值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**"的,所以一定会匹配上,就可以响应图片。

     

    访问一个图片,还要走层层匹配。不知性能如何?

    最后再说明一下,方案二、方案三 在访问静态资源时,如果有匹配的(近似)总拦截器,就会走拦截器。如果你在拦截中实现权限检查,要注意过滤这些对静态文件的请求。

    如何你的DispatcherServlet拦截 *.do这样的URL后缀,就不存上述问题了。还是有后缀方便。

  • 相关阅读:
    BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
    Luogu 3690 Link Cut Tree
    CF1009F Dominant Indices
    CF600E Lomsat gelral
    bzoj 4303 数列
    CF1114F Please, another Queries on Array?
    CF1114B Yet Another Array Partitioning Task
    bzoj 1858 序列操作
    bzoj 4852 炸弹攻击
    bzoj 3564 信号增幅仪
  • 原文地址:https://www.cnblogs.com/ihanliu/p/4895905.html
Copyright © 2011-2022 走看看