zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    [转载]openerp 6.0.2库存业务
    [转载]OPENERP 6.0.2中的财务概念
    负载均衡
    SQL Server高可用性部署实施 SQL server 群集
    在苹果lion中安装xcode3系列版本
    MacBook 以及 XCode 使用小结
    C++必知的几个知识点
    最新 xcode 4.2 ios 5.0无证书发布ipa文件
    负载参考
    SQLSERVER 2005 表分区说明
  • 原文地址:https://www.cnblogs.com/ryyy/p/14237358.html
Copyright © 2011-2022 走看看