中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用SpringBoot 攔截器怎么對請求進行判斷

發布時間:2020-12-28 14:58:33 來源:億速云 閱讀:507 作者:Leah 欄目:開發技術

使用SpringBoot 攔截器怎么對請求進行判斷?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

自定義注解

/**
 * 對比請求的用戶身份是否符合
 * @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 = "根據手機號來刪除用戶")
  @PostMapping(value = "/delete_phone")
  public BaseCommonResult<Integer> deletePhone(@CompareUser(value = "phone") String phone) {
    int i = userService.deleteByPhone(phone);
    return BaseCommonResult.success(i);
  }

參數解析器

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

/**
 * @author liuyalong
 * @date 2020/9/25 15:56
 */
public class BaseCurrentUserInterceptor implements HandlerMethodArgumentResolver {
  /**
   * 用于判定是否需要處理該參數注解,返回true為需要,
   * 并會去調用下面的方法resolveArgument。
   */
  @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 ,把優先級調最高
  // 但是這樣@PathParam @RequestParam就失效了,@CompareUser(value="xxx")可以完全替換@RequestParam功能
//  @Override
//  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
//    resolvers.add(currentUserInterceptor);
//
//  }

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

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

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

關于使用SpringBoot 攔截器怎么對請求進行判斷問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卓尼县| 泾源县| 盐池县| 将乐县| 灵武市| 海门市| 万荣县| 资讯| 胶州市| 灵璧县| 靖宇县| 千阳县| 凤山县| 威海市| 泸水县| 鄂托克旗| 霍城县| 崇礼县| 泌阳县| 渝北区| 汾西县| 星子县| 建始县| 平果县| 贵阳市| 和平县| 津市市| 湘潭县| 台州市| 准格尔旗| 如东县| 昔阳县| 南昌市| 万荣县| 两当县| 社旗县| 灌南县| 罗江县| 青田县| 乌什县| 天长市|