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 {}
}