springboot-WebMvcConfigurer配置拦截器/跨域/格式化/注册控制器

WebMvcConfigurer 是用来全局定制化Spring Boot 的 MVC 特性。开发者通过实现WebMvcConfigurer 接口来配置应用的 MVC 全局特性。

配置类如下:

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
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;

/**
 * mvc配置类
 */
@Configuration
public class MvcConfigurer implements WebMvcConfigurer {

    //拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //将加一个拦截器,检查会话,所有/admin开头的请求都经过此拦截器
        registry.addInterceptor(new MyLoginInterceptor()).addPathPatterns("/admin/**");
    }

    //跨域访问 配置
    @Override
    public void addCorsMappings(CorsRegistry registry) {
    	//仅仅允许来自 domain2.com 的跨域访问,并且限定访问路径为/api 、方法是 POST 或者 GET 。
        registry.addMapping("/api/**")
                .allowedOrigins(" http : //domain2.com")
                .allowedMethods(" POST", "GET");
    }

    //格式化
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //注册一个格式转换器
        registry.addFormatter(new DateFormatter ("yyyy-MM-dd"));
    }

    // URI 到视图的映射
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //对于index.html的请求,设置返回的视图为index.htl 。
        registry.addViewController ("/index.html").setViewName ("/index.htl");
        //所有以.do结尾的请求重定向到/index.html请求 。
        registry.addRedirectViewController ("/**/*.do","/index.html");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

1. 拦截器

通过 addlnterceptors 方法可以设置多个拦截器,比如对特定的 URI 设定拦截器以检查用户是否登录,打印处理用户请求耗费的时间等。

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Author ccl
 * @Date 2021/1/3 17:03
 */
public class MyLoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //简单逻辑,只有tom能登录
        System.out.println("进入拦截器");
        User user = (User) request.getSession().getAttribute("user");
        if (user == null) {
            System.out.println("该用户没有登录");
            response.sendRedirect("/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 {

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

拦截器有以下三个方法需要覆盖实现:
preHandle , 在调用 Controller 方法前会调用此方法 。
postHandle , 在调用 Controller 方法结束后、页面渲染之前调用此方法,比如可以在这
里将渲染的视图名称更改为其他视图名称 。
afterCompletion ,页面渲染完毕后调用此方法 。

2. 跨域访问

Spring Boot 提供了对 CORS 的支持,可以实现 addCorsMappings 接口来添加特定的配置 :

允许所有跨域访问

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping ("/**");
    }
  • 1
  • 2
  • 3
  • 4

或者更为精细的控制,如下

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins(" http : //domain2.com")
                .allowedMethods(" POST", "GET");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

仅仅允许来自 domain2.com 的跨域访问,并且限定访问路径为/api 、方法是 POST 或者 GET 。

跨域原理简单点理解就是发起跨域请求的时候 , 浏览器会对请求域返回的响应信息检查 HTTP 头 ,如果 Access-Control-Allow-Origin 包含了自身域,则表示允许访问 。 否则报错,这就是 allowedOrigin的作用 。

3. 格式化

    //格式化
    @Override
    public void addFormatters(FormatterRegistry registry) {
        //注册一个格式转换器
        registry.addFormatter(new DateFormatter ("yyyy-MM-dd"));
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

自定义格式转换器,将入参中名为date且类型为String的参数根据格式,转换为Date类型;

import org.springframework.format.Formatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

/**
 * @Author ccl
 * @Date 2021/1/3 17:39
 */
public class DateFormatter implements Formatter<Date> {

    private  SimpleDateFormat sf;
    public DateFormatter(String format) {
        this.sf = new SimpleDateFormat(format);
    }

    @Override
    public Date parse(String date, Locale locale) throws ParseException {
       return sf.parse(date);
    }

    @Override
    public String print(Date object, Locale locale) {
        return null;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

4. 注册controller

应用有时候没有必要为一个 URL 专门写一个 Controller 方法,可以直接将 URI 请求转到对模板的渲染上 。 比如应用中的如下代码:

    // URI 到视图的映射
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //对于index.html的请求,设置返回的视图为index.htl 。
        registry.addViewController ("/index.html").setViewName ("/index.htl");
        //所有以.do结尾的请求重定向到/index.html请求 。
        registry.addRedirectViewController ("/**/*.do","/index.html");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果觉得本文对您有帮助,请点赞支持,非常感谢;

原文地址:https://www.cnblogs.com/ryyy/p/14237358.html