• 08、SpringBoot配置拦截器


    在SpringBoot中配置拦截器,主要有下面两个步骤:

    1、继承接口 HandlerInterceptor,根据需要重写其中的三个类。

    2、在配置类中注入该类。

    public class MyInterceptor implements HandlerInterceptor {
    
        //controller执行之前
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandler......");
            return true;
        }
    
        //执行完controller执行之后、视图渲染前调用,可以在该方法里获取或者修改model
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandler......");
        }
    
        //一般用于清理资源
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion......");
        }
    }
    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            //1、全部拦截
    //        registry.addInterceptor(myInterceptor()).addPathPatterns("/**");
            //2、拦截指定路径
            registry.addInterceptor(myInterceptor()).addPathPatterns("/hello");
        }
    
        @Bean
        MyInterceptor myInterceptor(){
            return new MyInterceptor();
        }
    
    }

    写个controller测试一下

    @RestController
    public class HelloController {
    
        @RequestMapping("/hello")
        public String hello(){
            System.out.println("hello");
            return "hello";
        }
    
        @RequestMapping("/world")
        public String world(){
            System.out.println("world");
            return "world";
        }
    }

    测试结果:

    preHandler......
    hello
    postHandler......
    afterCompletion......
    world

    SpringBoot中还有一终拦截器,WebRequestInterceptor

    public class MyWebRequestInterceptor implements WebRequestInterceptor {
        @Override
        public void preHandle(WebRequest webRequest) throws Exception {
    
        }
    
        @Override
        public void postHandle(WebRequest webRequest, ModelMap modelMap) throws Exception {
    
        }
    
        @Override
        public void afterCompletion(WebRequest webRequest, Exception e) throws Exception {
    
        }
    }

    和HandlerInterceptor比较相似,但是可以发现,该拦截器的preHandler返回值为空,说明该方法并不影响后面方法的执行。那么这个拦截器存在的目的是什么呐?

    点进WebRequest:

    public interface WebRequest extends RequestAttributes {
        @Nullable
        String getHeader(String var1);
    
        @Nullable
        String[] getHeaderValues(String var1);
    
        Iterator<String> getHeaderNames();
    
        @Nullable
        String getParameter(String var1);
    
        @Nullable
        String[] getParameterValues(String var1);
    
        Iterator<String> getParameterNames();
    
        Map<String, String[]> getParameterMap();
    
        Locale getLocale();
    
        String getContextPath();
    
        @Nullable
        String getRemoteUser();
    
        @Nullable
        Principal getUserPrincipal();
    
        boolean isUserInRole(String var1);
    
        boolean isSecure();

    发现对reques请求中参数做了进一步处理(@Nullable表示可以为空),更加的方便调用。所以两个拦截器的侧重点不同,HandlerInterceptor功能较为强大,可以拦截请求,可以实现WebRequestInterceptor的所有功能,只是要写的逻辑代码要多一点。更而WebRequestInterceptor倾向于简化获取request参数的过程以及预设参数供后面的流程使用。

    参考链接:https://www.jianshu.com/p/25ea148edbc1

  • 相关阅读:
    如何实现parseFloat保留小数点后2位
    C#正则表达式整理备忘
    HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
    c# using的几种用法
    QQ截图 有快捷键的,如Shift+S
    史上最深刻的黄段子
    文本框回车自动提交
    C#与ASP.NET中DateTime.Now函数详解
    ASP.NET页面生命周期
    .NET中HttpWebRequest详解
  • 原文地址:https://www.cnblogs.com/phdeblog/p/13261288.html
Copyright © 2020-2023  润新知