Spring boot 静态资源处理以及拦截器的使用

时间:2024-04-09 09:07:01

前言

本章主要围绕WebMvcConfigurer,简单介绍spring boot如何处理静态资源以及使用拦截器的使用

静态资源

spring boot默认为我们提供默认的配置方式

  • classpath:/META-INF/resources
  • classpath:/resources
  • classpath:/static
  • classpath:/public

项目对应的目录如下

Spring boot 静态资源处理以及拦截器的使用

优先级顺序为:META-INF/resources > resources > static > public

对应的配置文件配置如下:

# 默认值为 /**
spring:
  mvc:
    static-path-pattern: /**

#  #设置要指向的路径,默认值为: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
  resources:
    static-locations: 设置要指向的路径

我们可以通过修改static-path-pattern的值改变其默认的映射,如改成

spring:
  mvc:
    static-path-pattern: /test/**

则访问static 等目录下的test.html文件,应该为:localhost:8080/test/test.html

使用WebMvcConfigurer配置SpringMVC

spring boot 2.0以下的版本是通过WebMvcConfigurerAdapter来配置的,而spring boot 2.*则是通过WebMvcConfigurer进行配置

Spring boot 静态资源处理以及拦截器的使用

这里主要讲解几个常用的,如:静态资源处理、自定义视图控制器、拦截器的的使用。

新增ConfigurerAdapter.class,实现WebMvcConfigurer接口

@Configuration
public class ConfigurerAdapter implements WebMvcConfigurer {

}

我们在配置类上添加了注解@Configuration,标明了该类是一个配置类并且会将该类作为一个SpringBean添加到IOC容器内

添加静态资源处理

在ConfigurerAdapter重写addResourceHandlers方法

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 通过addResourceHandler添加映射路径,然后通过addResourceLocations来指定路径
        registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
    }

在resources下新增目录my,并添加文件mytest.html,进行访问测试
Spring boot 静态资源处理以及拦截器的使用

指定外部的目录

通常用于图片上传后的访问

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        
        //自定义外部静态资源
        registry.addResourceHandler("/my/**").addResourceLocations("D:\\data\\file");

    }

addResourceLocations指的是文件放置的目录,addResoureHandler指的是对外暴露的访问路径

自定义视图控制器

以前要访问一个页面需要先创建个Controller控制类,再写方法跳转到页面,通过重写addViewControllers方法就不需要那么麻烦了,直接访问http://localhost:8080/login.html就跳转到login页面了

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {

        // 对 "/admin" 的 请求 redirect 到登录页面
        registry.addRedirectViewController("/admin", "/user/login");
       
        // 将 "login.html" 的 请求响应跳转到登录页面
        registry.addViewController("/home").setViewName("/user/login");

        // 对 "/hello/**" 的请求 返回 404 的 http 状态
        registry.addStatusController("/hello/**", HttpStatus.NOT_FOUND);
    }

拦截器的使用

创建我们常用的登录拦截器
根据session中是否有user对象来判断是否登录,为空就跳转到登录页,不为空就通过。

/**
 * 登录拦截器
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(true);

        //如果session不存在,就重定向到登录页面
        if(session.getAttribute("user") == null){
            response.sendRedirect(request.getContextPath()+"/user/login");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

接着,在之前的ConfigurerAdapter类中重写addInterceptors方法如下:

@Override
    public void addInterceptors(InterceptorRegistry registry) {
        /**
         * 登录拦截器,并添加过滤规则
         */
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login.html","/login","/css/**","/js/**");
    }

addPathPatterns("/**")对所有请求都拦截,但是排除了/login.html、/login和静态资源请求的拦截。
spring boot 2.0对静态资源也进行了拦截,当拦截器拦截到请求之后,但controller里并没有对应的请求,该请求会被当成是对静态资源的请求。因此这里也要添加对静态资源的过滤

总结

到这里静态资源和拦截器的使用就介绍完了,有关WebMvcConfigurer的更多用法,可以查看官方文档

官方文档

项目源码

github:https://github.com/dqjdda/SpringBoot_All

码云:https://gitee.com/hgpt/SpringBoot_All

开源后台管理系统

欢迎体验Aurora

github: https://github.com/dqjdda/Aurora

码云: https://gitee.com/hgpt/Aurora