• SpringMVC


    什么是静态资源?

    css、js、图片、html等都是静态资源

    1. 放行静态资源

    1、不使用 springmvc 框架分析

    不使用 springmvc 框架,这些静态资源请求都会由 tomcat 的默认的 default 进行处理。

    2、使用了 springmvc 框架分析

    当配置的 DispatcherServlet 的映射路径不为 / 时,对静态资源的请求最终会由 tomcat 的默认配置来处理,所以不影响静态资源的正常访问。
    如果配置的 DispatcherServlet 的映射路径为 / 时,会覆盖掉tomcat的默认的 default 配置,所以需要在 springmvc 文件中进行配置,对静态资源进行放行。

    1)在 springmvc.xml 中放行 - 需要开启 <mvc:annotation-driven /> 注解驱动

    1、对全部资源放行

    在springmvc文件中配置上 <mvc:default-servlet-handler/> ,发出静态资源请求后,请求传到 DispatcherServlet,DispatcherServlet 调用 RequestMappingHandlerMapping 进行映射匹配,匹配不成功,DispatcherServlet 最终会将请求转交给 tomcat 默认 default 进行处理。

    <mvc:default-servlet-handler/>

    2、对指定目录下的资源放行 - <mvc:resources/>

    如果配置了拦截器,需要在拦截器中进行过滤,否则会被拦截;

    * 代表一级目录,** 代表多级目录

    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/js/" mapping="/js/**" />
    <mvc:resources location="/fonts/" mapping="/fonts/**" />
    <mvc:resources location="/picture/" mapping="/picture/**" />
    <mvc:resources location="/admin/" mapping="/admin/**" />

    补充说明多个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 是匹 "/**"的,所以一定会匹配上,再响应图片。 

    2)在web.xml中放行

    1、在 web.xml 配置前端控制器 DispatcherServlet 的时候指定 url-pattern 以扩展名结尾;例如:*.do,*.html 等;

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 
            contextConfigLocation不是必须的, 如果不配置contextConfigLocation, 
            springmvc的配置文件默认找:WEB-INF/servlet的name+"-servlet.xml"
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
        <!-- 配置springmvc什么时候启动,参数必须为整数 -->
        <!-- 如果等于0或大于0,则springmvc随服务器的启动而启动 -->
        <!-- 小于0,则在第一次访问的时候启动 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
     
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 
            1. /*  拦截所有   jsp  js png .css
            2. *.action *.do 拦截以do action 结尾的请求
            3. /  拦截所有 (不包括jsp) (包含.js .png.css)
         -->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    2、激活 Tomcat 的 defaultServlet 来处理静态文件

    在 web.xml 配置 default servlet-mapping 的 url-pattern ,以目录形式和扩展名形式。要写在DispatcherServlet的前面,让 defaultServlet 先拦截,这个就不会进入Spring了; 

    不同的 servlet 容器/应用服务器,处理这些静态资源的 servlet 的名字不大一样: 

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

    * 代表一级目录,** 代表多级目录

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/admin/*</url-pattern>
        <url-pattern>*.css</url-pattern>
        <url-pattern>*.tff</url-pattern>
        <url-pattern>*.woff</url-pattern>
        <url-pattern>*.js</url-pattern>
        <url-pattern>*.png</url-pattern>
    </servlet-mapping>

    2. 其他请求不到静态资源的可能原因

    1)jsp 或者 html 界面引用 js 文件错误

    编写script时没有写完整,有些浏览器还不报错。

    错误:<script type="text/javascript" src="${pageContext.request.contextPath }/css/main.min.css" />
    正确:<script type="text/javascript" src="${pageContext.request.contextPath }/css/main.min.css"></script>

    2)在WEB-INF目录下的静态资源只有服务器能访问,客户端无法直接访问

    众所周知,WEB-INF 是被保护的目录,不允许客户端进行访问,这里就涉及两个概念:

    请求转发 和 重定向

     

    请求转发会间接的由服务器去访问WEB-INF,所以可以访问, 

    重定向请求静态资源属于客户端进行请求,所以不能访问静态资源。

  • 相关阅读:
    在线jq库
    解决python3.6的UnicodeEncodeError: 'gbk' codec can't encode character 'xbb' in position 28613: illegal multibyte sequence
    PHP后台支付的开发:微信支付和支付宝支付
    PHP操控Excel视频教程
    微信h5静默、非静默授权获取用户openId的方法和步骤
    OAuth2.0微信网页授权登录
    微信第三方登录 -- (PC端+移动端)
    web字体规范
    移动端字体设置
    在 Web 内容中使用系统字体
  • 原文地址:https://www.cnblogs.com/Dm920/p/12152613.html
Copyright © 2020-2023  润新知