使用SpringBoot拦截器怎么对请求进行判断

  介绍

使用SpringBoot拦截器怎么对请求进行判断?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

自定义注解

/* *   ,*对比请求的用户身份是否符合   ,* @author  liuyalong   ,* @date  2020/9/25  16:03   ,*/@Target (ElementType.PARAMETER)   @Retention (RetentionPolicy.RUNTIME)   public  @interface  CompareUser  {   ,/* *   ,,*,从而name  of 从而request  parameter 用bind 。   ,,*/@AliasFor才能(“name"), String 价值(),default ““;   @AliasFor才能(“value"), String 名字(),default ““;   }

给控制器的字段添加注解

,, @ApiOperation (=value “删除用户“,,notes =,“根据手机号来删除用户“)   @PostMapping才能(value =,“/delete_phone")   public 才能;BaseCommonResult< Integer>, deletePhone (@CompareUser (=value “phone"), String 电话),{   ,,,int 小姐:=,userService.deleteByPhone(电话);   ,,,return  BaseCommonResult.success(我);   ,,}

参数解析器

记得继承后加@ component,这里是基础……所以不用

/* *   ,* @author  liuyalong   ,* @date  2020/9/25  15:56   ,*/public  class  BaseCurrentUserInterceptor  implements  HandlerMethodArgumentResolver  {   ,/* *   ,,*,用于判定是否需要处理该参数注解,返回真正的为需要,   ,,*,并会去调用下面的方法resolveArgument。   ,,*/@Override才能   public 才能;boolean  supportsParameter (MethodParameter 参数),{   ,,,//只处理CurrentUser注解修饰的参数   ,,,return  parameter.hasParameterAnnotation (CompareUser.class);   ,,}      ,/* *   ,,*,对比用户信息   ,,*/@Override才能   public 才能;Object  resolveArgument (MethodParameter 参数,ModelAndViewContainer  mavContainer,, NativeWebRequest  webRequest,, WebDataBinderFactory  binderFactory), throws  Exception  {   ,,,CompareUser  parameterAnnotation =, parameter.getParameterAnnotation (CompareUser.class);      ,,,Class<?祝辞,parameterType =, parameter.getParameterType ();   ,,,if  (parameterAnnotation ==, null), {   ,,,,,throw  new  IllegalArgumentException (“Unknown  parameter  type  [,, +, parameterType.getName (), +,“]”);   ,,,}      ,,/*   ,,,,*,获取要验证的字段名   ,,,*/,,,//检查是否给字段取了别名   ,,,String  paramName =,““.equalsIgnoreCase (parameterAnnotation.name ()), ?, parameterAnnotation.value (),:, parameterAnnotation.name ();   ,,,if  (““.equalsIgnoreCase (parameterAnnotation.name ())), {   ,,,,,//从参数中获取定义的字段名   ,,,,,paramName =, parameter.getParameter () . getname ();   ,,,}      ,,,//获取请求字段的值   ,,,String  paramValue =, String.valueOf (webRequest.getParameter (paramName));      ,,,//从请求头中获取已经登录的用户   ,,,String  userName =, webRequest.getHeader (AuthConstant.USER_TOKEN_HEADER);      ,,,//对于根用户,可以操作一切,所以直接返回   ,,,if  (! AuthConstant.ROOT_USER.equals(用户名),{   ,,,,,//判断身份是否一致,不一致就抛出异常,让RestControllerAdvice处理   ,,,,,if  (userName ==, null  | |, ! userName.equals (paramValue)), {   ,,,,,,,throw  new  NotSameAuthorException ();   ,,,,,}   ,,,}   ,,,//将参数原封不动返回出去,需要还原回需要的类型   ,,,WebDataBinder  binder =, binderFactory.createBinder (webRequest, parameterType,, paramName);   ,,,return  binder.convertIfNecessary (paramValue, parameterType,,参数);   ,,}   }

配置WebMvcConfigurer

注意这里提供了两种方式加载,因为

@ configuration   public  class  WebMvcConfig  implements  WebMvcConfigurer  {   @ autowired才能   private 才能;HandlerInterceptor  handlerInterceptor;      @ autowired才能   private 才能;HandlerMethodArgumentResolver  currentUserInterceptor;      @ autowired才能   private 才能;RequestMappingHandlerAdapter  requestMappingHandlerAdapter;      @Override才能   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

使用SpringBoot拦截器怎么对请求进行判断