栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot 拦截器和自定义注解判断请求是否合法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot 拦截器和自定义注解判断请求是否合法

应用场景举例:

当不同身份的用户请求一个接口时,用来校验用户某些身份,这样可以对单个字段数据进行精确权限控制,具体看代码注释

自定义注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CompareUser {
  
  @AliasFor("name") String value() default "";
  @AliasFor("value") String name() default "";
}
给controller的字段添加注解
  @ApiOperation(value = "删除用户", notes = "根据手机号来删除用户")
  @PostMapping(value = "/delete_phone")
  public baseCommonResult deletePhone(@CompareUser(value = "phone") String phone) {
    int i = userService.deleteByPhone(phone);
    return baseCommonResult.success(i);
  }
参数解析器

记得继承后加@Component,这里是base...所以不用


public class baseCurrentUserInterceptor implements HandlerMethodArgumentResolver {
  
  @Override
  public boolean supportsParameter(MethodParameter parameter) {
    //只处理CurrentUser注解修饰的参数
    return parameter.hasParameterAnnotation(CompareUser.class);
  }

  
  @Override
  public Object resolveArgument(MethodParameter parameter, 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);

    //对于root用户,可以操作一切,所以直接返回
    if (!AuthConstant.ROOT_USER.equals(userName)) {
      //判断身份是否一致,不一致就抛出异常,让RestControllerAdvice处理
      if (userName == null || !userName.equals(paramValue)) {
 throw new NotSameAuthorException();
      }
    }
    //将参数原封不动返回出去,需要还原回需要的类型
    WebDataBinder binder = binderFactory.createBinder(webRequest, parameterType, paramName);
    return binder.convertIfNecessary(paramValue, parameterType, parameter);
  }
}
配置WebMvcConfigurer

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

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
  @Autowired
  private HandlerInterceptor handlerInterceptor;

  @Autowired
  private HandlerMethodArgumentResolver currentUserInterceptor;

  @Autowired
  private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(handlerInterceptor).addPathPatterns("
  @PostConstruct
  public void init() {
    // 获取当前 RequestMappingHandlerAdapter 所有的 Resolver 对象
    List resolvers = requestMappingHandlerAdapter.getArgumentResolvers();
    List newResolvers = new ArrayList<>(resolvers.size() + 1);

    // 添加自定义参数解析器到集合首位
    newResolvers.add(currentUserInterceptor);

    // 添加 已注册的 Resolver 对象集合
    newResolvers.addAll(resolvers);
    // 重新设置 Resolver 对象集合
    requestMappingHandlerAdapter.setArgumentResolvers(newResolvers);
  }
}
效果

只有特定身份人员才可以删除操作

以上就是SpringBoot 拦截器和自定义注解判断请求是否合法的详细内容,更多关于SpringBoot 拦截器和自定义注解的资料请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/129651.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号