前言
本章主要围绕WebMvcConfigurer,简单介绍spring boot如何处理静态资源以及使用拦截器的使用
静态资源
spring boot默认为我们提供默认的配置方式
- classpath:/META-INF/resources
- classpath:/resources
- classpath:/static
- classpath:/public
项目对应的目录如下
优先级顺序为: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进行配置
这里主要讲解几个常用的,如:静态资源处理、自定义视图控制器、拦截器的的使用。
新增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,进行访问测试
指定外部的目录
通常用于图片上传后的访问
@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