springboot的WebMvcConfigurer接口学习

WebMvcConfigurer接口说明

WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口;

下面只说项目中使用到的方法,直接上代码
代码中有说明如何使用

@Configuration
public class WebConfig implements WebMvcConfigurer {

  /**
   * addInterceptors:拦截器 addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
   * addPathPatterns:用于设置拦截器的过滤路径规则; addPathPatterns("/**")对所有请求都拦截
   * excludePathPatterns:用于设置不需要拦截的过滤规则 拦截器主要用途:进行用户登录状态的拦截,日志的拦截等。
   */
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry
        .addInterceptor(new WebInterceptors())
        // 全部拦截
        .addPathPatterns("/**")
        // 不拦截的地址
        .excludePathPatterns("/demo/**");
  }
}
拦截器模板HandlerInterceptor
/**
 * 其实以前都是继承WebMvcConfigurerAdapter类 不过springBoot2.0以上 WebMvcConfigurerAdapter 方法过时,有两种替代方案:
 * 1、继承WebMvcConfigurationSupport 2、实现WebMvcConfigurer
 * 但是继承WebMvcConfigurationSupport会让Spring-boot对mvc的自动配置失效。根据项目情况选择。现在大多数项目是前后端分离
 * ,并没有对静态资源有自动配置的需求所以继承WebMvcConfigurationSupport也未尝不可。
 */
@Slf4j
public class WebInterceptors implements HandlerInterceptor {

  /** 在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理; */
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {

    log.info("request请求地址path[{}] uri[{}]", request.getServletPath(),request.getRequestURI());
    //request.getHeader(String) 从请求头中获取数据
    //从请求头中获取用户token(登陆凭证根据业务而定)
    Long userId= getUserId(request.getHeader("H-User-Token"));
    if (userId != null && checkAuth(userId,request.getRequestURI())){
      return true;
    }
    //这里的异常是我自定义的异常,系统抛出异常后框架捕获异常然后转为统一的格式返回给前端, 其实这里也可以返回false
    throw new RRException(BizCodeEnum.MISSINGREQUESTHEADER);
  }
  /**
   * 根据token获取用户ID
   * @param userToken
   * @return
   */
  private Long getUserId(String userToken){
    if (StrUtil.isBlank(userToken)){
      return null;
    }
    Long userId = Long.parseLong(userToken);
    log.debug("userId:{}",userId);
    return userId;
  }

  /**
   * 校验用户访问权限
   * @param userId
   * @param requestURI
   * @return
   */
  private boolean checkAuth(Long userId,String requestURI){
    return true;
  }
  /**
   * 在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView
   * (这个博主就基本不怎么用了)
   */
  public void postHandle(
      HttpServletRequest request,
      HttpServletResponse response,
      Object handler,
      @Nullable ModelAndView modelAndView)
      throws Exception {}

  /**在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面);*/
  public void afterCompletion(
      HttpServletRequest request,
      HttpServletResponse response,
      Object handler,
      @Nullable Exception ex)
      throws Exception {}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值