• 【Spring boot 拦截器 HandlerInterceptor】


    Spring boot 拦截器 HandlerInterceptor
    上一章对过滤器的定义做了说明,也比较简单。过滤器属于 Servlet 范畴的 API,与 Spring 没什么关系。
    Web 开发中,我们除了使用 Filter 来过滤请 web 求外,还可以使用 Spring 提供的 HandlerInterceptor(拦 截器)。
    HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在 request 被响应之前、request 被响
    应之后、视图渲染之前以及 request 全部结束之后。我们不能通过拦截器修改 request 内容,但是可以通过抛出
    异常(或者返回 false)来暂停 request 的执行。
    实现 UserRoleAuthorizationInterceptor 的拦截器有:
    ConversionServiceExposingInterceptor
    CorsInterceptor
    LocaleChangeInterceptor
    PathExposingHandlerInterceptor
    ResourceUrlProviderExposingInterceptor
    ThemeChangeInterceptor
    UriTemplateVariablesHandlerInterceptor
    UserRoleAuthorizationInterceptor
    其中 LocaleChangeInterceptor 和 ThemeChangeInterceptor 比较常用。
    配 置 拦 截 器 也很简单, Spring 为什么提供了 基 础 类 WebMvcConfigurerAdapter ,我们 只 需 要 重 写
    addInterceptors 方法添加注册拦截器。
    实现自定义拦截器只需要 3 步:
    1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
    2、创建一个 Java 类继承 WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
    2、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在 addInterceptors 方法中添加)。
    PS:本文重点在如何在 Spring-Boot 中使用拦截器,关于拦截器的原理请大家查阅资料了解。
    代码:
    com.hpit.sb.interceptors. MyInterceptor1
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.log4j.Logger;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    /**
    * TODO 使用常规的方式开发springmvc拦截器1
    *
    *
    */
    public class MyInterceptor1 implements HandlerInterceptor {
    private Logger logger = Logger. getLogger (getClass());
    @Override
    public void afterCompletion(HttpServletRequest request , HttpServletResponse response , Object object ,
    Exception exception ) throws Exception {
    logger .info( "afterCompletion..." );
    }
    @Override
    public void postHandle(HttpServletRequest request , HttpServletResponse response , Object object ,
    ModelAndView modelAndView ) throws Exception {
    logger .info( "postHandle..." );
    }
    @Override
    public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object object )
    throws Exception {
    logger .info( "preHandle..." );
    return true ;
    }
    }
    com.hpit.sb.interceptors. MyInterceptor2
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.log4j.Logger;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    /**
    * TODO 使用常规的方式开发springmvc拦截器2
    *
    */
    public class MyInterceptor2 implements HandlerInterceptor {
    private Logger logger = Logger. getLogger (getClass());
    @Override
    public void afterCompletion(HttpServletRequest request , HttpServletResponse response , Object object ,
    Exception exception ) throws Exception {
    logger .info( "afterCompletion..." );
    }
    @Override
    public void postHandle(HttpServletRequest request , HttpServletResponse response , Object object ,
    ModelAndView modelAndView ) throws Exception {
    logger .info( "postHandle..." );
    }
    @Override
    public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object object )
    throws Exception {
    logger .info( "preHandle..." );
    return true ;
    }
    }
    重写 web 配置 addInterceptors()方法,添加自定义拦截器:
    com.hpit.sb.config. MyWebAppConfig
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    import com.hpit.sb.interceptors.MyInterceptor1;
    import com.hpit.sb.interceptors.MyInterceptor2;
    /**
    * TODO 重写webmvc配置
    *
    */
    @Configuration
    public class MyWebAppConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry ) {
    // 重写addInterceptors方法并为拦截器配置拦截规则
    registry .addInterceptor( new MyInterceptor1()).addPathPatterns( "/**" );
    registry .addInterceptor( new MyInterceptor2()).addPathPatterns( "/**" );
    //排除路径
    //registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").excludePathPatterns("/Hello");
    super .addInterceptors( registry );
    }
    }
    启动日志,请求任意控制器:日志输出:

     

  • 相关阅读:
    「Python循环结构」利用while循环求1~n的平方和
    请求转发与重定向
    Java面试时,该如何准备亮点?
    02数据结构与算法刷题之【哈希表】篇
    WinUI 3 踩坑记:前言
    incarnation flashback database 时可以 offline 不符合的 datafile
    JavaIO流01:File类
    systrace/perfetto抓取方式分享
    第1章CRM核心业务介绍
    揭秘:渗透测试的第一步 - 信息收集的关键策略
  • 原文地址:https://blog.csdn.net/m0_72254454/article/details/127769533