欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot 攔截器和自定義注解判斷請求是否合法

 更新時間:2020年12月28日 11:49:00   作者:rm-rf*  
這篇文章主要介紹了SpringBoot 攔截器和自定義注解判斷請求是否合法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下

應用場景舉例:

當不同身份的用戶請求一個接口時,用來校驗用戶某些身份,這樣可以對單個字段數(shù)據(jù)進行精確權限控制,具體看代碼注釋

自定義注解

/**
 * 對比請求的用戶身份是否符合
 * @author liuyalong
 * @date 2020/9/25 16:03
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CompareUser {
  /**
   * The name of the request parameter to bind .
   */
  @AliasFor("name") String value() default "";
  @AliasFor("value") String name() default "";
}

給controller的字段添加注解

  @ApiOperation(value = "刪除用戶", notes = "根據(jù)手機號來刪除用戶")
  @PostMapping(value = "/delete_phone")
  public BaseCommonResult<Integer> deletePhone(@CompareUser(value = "phone") String phone) {
    int i = userService.deleteByPhone(phone);
    return BaseCommonResult.success(i);
  }

參數(shù)解析器

記得繼承后加@Component,這里是Base...所以不用

/**
 * @author liuyalong
 * @date 2020/9/25 15:56
 */
public class BaseCurrentUserInterceptor implements HandlerMethodArgumentResolver {
  /**
   * 用于判定是否需要處理該參數(shù)注解,返回true為需要,
   * 并會去調用下面的方法resolveArgument。
   */
  @Override
  public boolean supportsParameter(MethodParameter parameter) {
    //只處理CurrentUser注解修飾的參數(shù)
    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())) {
      //從參數(shù)中獲取定義的字段名
      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();
      }
    }
    //將參數(shù)原封不動返回出去,需要還原回需要的類型
    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("/**");
  }

  //參數(shù)解析器,自定義的優(yōu)先級最低,所以會失效,
  // 解決方案是下面的 @PostConstruct ,把優(yōu)先級調最高
  // 但是這樣@PathParam @RequestParam就失效了,@CompareUser(value="xxx")可以完全替換@RequestParam功能
//  @Override
//  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
//    resolvers.add(currentUserInterceptor);
//
//  }

  /**
   *參數(shù)解析器優(yōu)先級調最高
   */
  @PostConstruct
  public void init() {
    // 獲取當前 RequestMappingHandlerAdapter 所有的 Resolver 對象
    List<HandlerMethodArgumentResolver> resolvers = requestMappingHandlerAdapter.getArgumentResolvers();
    List<HandlerMethodArgumentResolver> newResolvers = new ArrayList<>(resolvers.size() + 1);

    // 添加自定義參數(shù)解析器到集合首位
    newResolvers.add(currentUserInterceptor);

    // 添加 已注冊的 Resolver 對象集合
    newResolvers.addAll(resolvers);
    // 重新設置 Resolver 對象集合
    requestMappingHandlerAdapter.setArgumentResolvers(newResolvers);
  }
}

效果

只有特定身份人員才可以刪除操作

以上就是SpringBoot 攔截器和自定義注解判斷請求是否合法的詳細內容,更多關于SpringBoot 攔截器和自定義注解的資料請關注腳本之家其它相關文章!

相關文章

  • mybatis新手快速入門以及一些錯誤匯總

    mybatis新手快速入門以及一些錯誤匯總

    這篇文章主要給大家介紹了關于mybatis新手快速入門以及一些錯誤的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • 詳解Java設計模式之抽象工廠模式

    詳解Java設計模式之抽象工廠模式

    設計模式是軟件設計中的一種常見方法,通過定義一系列通用的解決方案,來解決常見的軟件設計問題,其中,抽象工廠模式是一種非常常見的設計模式,文中有詳細的代碼示例供大家參考,感興趣的同學可以借鑒閱讀
    2023-05-05
  • Java數(shù)據(jù)結構學習之樹

    Java數(shù)據(jù)結構學習之樹

    這篇文章主要介紹了Java數(shù)據(jù)結構學習之樹,文中有非常詳細的代碼示例,對正在學習java數(shù)據(jù)結構的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • JAVA類變量及類方法代碼實例詳解

    JAVA類變量及類方法代碼實例詳解

    這篇文章主要介紹了JAVA類變量及類方法代碼實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java8中CompletableFuture的用法全解

    Java8中CompletableFuture的用法全解

    這篇文章主要給大家介紹了關于Java8中CompletableFuture用法的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • Java獲取視頻時長、大小的示例

    Java獲取視頻時長、大小的示例

    這篇文章主要介紹了Java獲取視頻時長、大小的示例,幫助大家利用Java處理視頻,完成需求,感興趣的朋友可以了解下
    2020-11-11
  • mybatis中association標簽的使用解讀

    mybatis中association標簽的使用解讀

    這篇文章主要介紹了mybatis中association標簽的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java多線程Thread , Future , Callable , FutureTask的使用

    Java多線程Thread , Future , Callable ,

    本文主要介紹了Java多線程Thread , Future , Callable , FutureTask的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Spring Boot異步調用@Async過程詳解

    Spring Boot異步調用@Async過程詳解

    這篇文章主要介紹了Spring Boot異步調用@Async過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 解讀@SelectProvider的使用方法

    解讀@SelectProvider的使用方法

    這篇文章主要介紹了@SelectProvider的使用方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評論