• [SpringMVC笔记] SpringMVC-12-放行静态资源访问


    SpringMVC-12-放行静态资源访问

    开发 SpringMVC 时,可能会遇到 html, css, js 等静态资源无法访问的情况

    原因是 Servlet 配置中拦截处理了所有的路径,以至于静态资源的路径被当作 Controller 中的映射路径处理,却无法找到对应的 Controller 方法,下面有两种方法可以解决

    方法1、缩小拦截的路径范围

    刚才说原因是 Servlet 配置中拦截了静态资源的路径经常处理,只要缩小拦截的范围,只处理 Controller 中的路径就可以解决问题

    对 Servlet 容器配置类中的 getServletMappings() 方法进行修改

    public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
        // 其余重写的方法省略
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/books", "/users"};    // 原返回值只有 "/"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    上面的样例只会拦截 /books 和 /users 为前缀的路径,不会再拦截其它的静态路径

    方法2、注册静态资源处理

    新增一个支持类继承自 WebMvcConfigurationSupport,重写其中的 addResourceHandlers() 方法,将静态资源的路径注册在其中,并且要使其能被 SpringMVC 的配置类扫描到

    @Configuration
    public class SpringMvcSupport extends WebMvcConfigurationSupport {
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            // 前为访问路径,后为资源的文件路径(末尾的 / 不能缺少),前后可以不一致
            registry.addResourceHandler("/pages/**").addResourceLocations("/html/");
            registry.addResourceHandler("/css/**").addResourceLocations("/css/");
            registry.addResourceHandler("/js/**").addResourceLocations("/js/");
            // 所有路径都按照静态资源处理(不常用)
            // registry.addResourceHandler("/**").addResourceLocations("/");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    设置 SpringMVC 配置类扫描范围

    @Configuration
    @ComponentScan({"com.mzz.controller", "com.mzz.config"})    // 刚才新增的类在 config 包下
    @EnableWebMvc
    public class SpringMvcConfig {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    将所有路径都当作静态资源处理也是可以的,实测不会影响 Controller 中的路径,但有相同的路径时会出现冲突,比如 /books 和 /books.html 同时存在,前者可以正常访问,后者则会报错

  • 相关阅读:
    与git相关错误的究极解决方案
    Neo4j Cannot to link java.nio.DirectByteBuffer
    Oracle安装 - shmmax和shmall设置
    Liunx两台服务器实现相互SSH免密登录
    Mysql 45讲学习笔记(三十一)误删数据
    第十届全国大学生光电设计竞赛(西北区赛)经历
    Winform C# .Net中给ListBox加ToolTip提示
    Java基础
    Python逆向之 eval 函数解析,看着一篇就会了,案例掌房
    如何打造新时代的终端播放产品?
  • 原文地址:https://blog.csdn.net/Cey_Tao/article/details/126440625