本文的核心内容:使用WebMvcConfigurer来全局定制SpringBoot的MVC特性。如拦截器,跨域访问,日期格式化,URI到视图的映射,JSON格式转化器(FastJson代替Spring Boot集成的Jackson作为Json的序列化工具),静态资源的配置。
我们可以通过实现WebMvcConfigurer接口来配置应用的MVC全局特性。【相当于我们之前使用SpringMVC把这些配置写到xxx-mvc.xml中一致】
注意:我们也可以通过继承 WebMvcConfigurationSupport类,重写这些方法。但是当我们继承 WebMvcConfigurationSupport类,SpringBoot的mvc自动配置会失效。
在 springboot的web自动配置类 WebMvcAutoConfiguration 上有一个条件注解 。
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
这个注解的意思是在项目类路径中 缺少 WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
//@Configuration 配置全局化特性 表示这是一段SpringBoot的配置文件
@Configuration
public class MvcConfigurer implements WebMvcConfigurer {
//格式化
@Override
public void addFormatters(FormatterRegistry registry) {
}
//拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
//跨域访问设置
@Override
public void addCorsMappings(CorsRegistry registry) {
}
//添加URI到视图的映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
}
//格式转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
}
//静态资源配置
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
super.addResourceHandlers(registry);
}
}
一:拦截器
拦截器需要实现HandlerInterceptor接口,并且注册到框架的拦截链中。
自定义拦截器
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//拦截请求 逻辑处理
//若请求继续,返回值true;中断请求,返回值False。
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//Controller方法处理完毕后,调用此方法。
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//页面渲染完调用此方法
}
}
将自定义拦截器增加到拦截链中。
//拦截器 拦截所有以/ajax/XXX 为路径的请求。
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/ajax/**");
}
二:日期格式化处理
对于日期类型的参数,Spring默认没有配置如何将字符串转为日期类型。为了格式化日期,需要添加一个DateFormatter类。
//格式化
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
}
三:跨域访问
出于安全考虑,浏览器回禁止AJAX访问不同域的地址。
W3C的CORS规范,允许实现跨域访问,并被大多数浏览器支持。
SpringBoot提供了对CORS的支持,可以实现addCorsMapping接口来添加特定的配置:
//跨域访问设置
@Override
public void addCorsMappings(CorsRegistry registry) {
//允许所有跨域访问,或者控制的更加细致。
registry.addMapping("/**");
}
四:注册Controller
有时,我们没有必要为一个URL指定一个Controller方法,可以直接将URI请求转到对模版的渲染上。
//添加URI到视图的映射
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("/index.ftl");
registry.addRedirectViewController("/**/*.do","/index");
}
对于/index请求,返回的视图为index.ftl。
所有以/xx/.do结尾的请求重定向到/index
五:格式化转化器【FastJson代替Jackson进行序列化】
引入FastJson的Maven依赖
<!--FastJson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
//格式转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 1. 创建json转换器
FastJsonHttpMessageConverter messageConverter = new FastJsonHttpMessageConverter();
// 2. 处理中文乱码
ArrayList<MediaType> mediaTypes = new ArrayList<MediaType>();
mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
messageConverter.setSupportedMediaTypes(mediaTypes);
// 3. 配置转换器
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.PrettyFormat); // 优雅的json格式
messageConverter.setFastJsonConfig(config);
// 4. 添加转换器
converters.add(messageConverter);
}
六:静态资源的配置
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if(!registry.hasMappingForPattern("/static/**")){
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
super.addResourceHandlers(registry);
}