解决Spring MVC拦截器导致静态资源访问失败(基于java注解配置附源码)

在这里插入图片描述

对于这个问题,我们准备了以下三种解决方案:

1、静态资源统一交由Servlet容器直接处理;
2、静态资源统一交由Spring MVC框架间接处理,再转交给Servlet容器处理;
3、静态资源统一交由Spring MVC框架直接处理;

从这3种解决方案中,处理静态资源的方式可以分为Servlet容器处理Spring MVC框架处理。在这里要说明的是,只要静态资源的请求经过Spring MVC框架的大门,如果不做额外的配置,就必然会跟拦截器扯上关系。

Xml配置方式:请点击这里

解决方案1:

静态资源统一交由Servlet容器直接处理
参考代码:
使用该接口WebApplicationInitializer可以实现web.xml配置文件的功能。

public class WebXml implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        //注册Spring MVC配置类来创建Spring MVC容器
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        //SpringMvcConfig.class它是Spring Mvc的配置类,需要自行编写
        ctx.register(SpringMvcConfig.class);
        ctx.setServletContext(servletContext);

        /*添加default servlet映射路径,将静态资源的请求直接
        由Servlet容器处理----------------此步骤最为关键------------------------*/
        ServletRegistration defaultServlt = servletContext.getServletRegistration("default");
        defaultServlt.addMapping("*.js", "*.css", "*.jpg","*.ico");

        //配置Spring MVC入口点,注册DispatcherServlet
        ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
        servlet.addMapping("/");
        servlet.setLoadOnStartup(1);

    }
}
 

结论:
加上该配置,即可解决静态资源请求失败的问题,此刻与Spring MVC完全没有关系,所以配置Spring MVC拦截器时,不用考虑对静态资源的处理。

解决方案2:

静态资源统一交由Spring MVC框架间接处理,再转交给Servlet容器处理
代码参考:
在这里插入图片描述

在这里插入图片描述

DefaultServletHttpRequestHandler处理器所在的映射器里并没有去获取我们在配置类中配置的拦截器,所以我们配置的拦截器对这个处理器并不生效,那么拦截器就可以不用特意对静态资源的路径进行排除操作。

源码参考:
@EnableWebMvc
@ComponentScan(basePackages = "com.xxx.controller")
public class SpringMvcConfig implements WebMvcConfigurer {

    //配置默认静态资源处理器
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable("default");
    }
    //配置Spring MVC拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        MyInterceptor myInterceptor = new MyInterceptor();
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");
    }
}

总结:如果采用这种方式处理静态资源,即使拦截器不排除静态资源的请求,也不会拦截;但是请注意,如果采用Xml配置的方式,就必须要排除静态资源的请求,这是2者不同配置的区别,具体可以查看Xml配置的那篇文章,有详细说明。

解决方案3:

静态资源统一交由Spring MVC框架直接处理
请查看截图中源码的差异性:
源码:Spring MVC5.0.0版本
在这里插入图片描述
在这里插入图片描述
从Spring MVC5.0.0版本中可以看出,ResourceHttpRequestHandler处理器的映射器并没有去获取配置类中的拦截器,所以,就算拦截器不排除静态资源的请求,也不会被拦截了。

结论:使用Spring MVC5.0.0版本或低版本开发的项目,配置拦截器的时候,即使不排除静态资源的路径,也不会对静态资源进行拦截,因为拦截器根本就没生效。

代码参考:
鉴于Spring MVC不同版本,建议采用统一在拦截器的配置中采用排除静态资源路径的方式,既适合高版本,也不影响低版本。

@EnableWebMvc
@ComponentScan(basePackages = "com.xxx.controller")
public class SpringMvcConfig implements WebMvcConfigurer {


    //配置静态资源映射
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
        registry.addResourceHandler("/jpg/**").addResourceLocations("/jpg/");
    }

    //配置Spring MVC拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        MyInterceptor myInterceptor = new MyInterceptor();
        registry.addInterceptor(myInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/js/**", "/css/**", "/jpg/**");
    }
}

总结:
1、如果采用第一种解决方案,拦截器不用做任何处理静态资源的操作。因为Spring MVC的DispatcherServlet没有匹配静态资源的请求。
2、如果采用第二种解决方案,拦截器也不用做任何处理静态资源的操作。因为配置类中的拦截器并没有生效。
2、如果采用第三种解决方案,鉴于Spring MVC不同版本,建议统一在拦截器的配置中采用排除静态资源的请求,既适合高版本,也不影响低版本。从而避免静态资源访问失败。

以上内容图片为转载,亦注油水印!其他为自个理解,欢迎交流讨论!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值