Spring Boot-全局化的特性

本文的核心内容:使用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);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值