91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

使用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

达拉特旗| 三亚市| 临潭县| 关岭| 玉树县| 马鞍山市| 广昌县| 赣州市| 嘉兴市| 南昌市| 中超| 泸水县| 隆安县| 三明市| 平谷区| 榆林市| 镶黄旗| 十堰市| 高陵县| 云林县| 资溪县| 兖州市| 荃湾区| 伊金霍洛旗| 栾城县| 衡水市| 昌黎县| 台北市| 东乡| 南和县| 朔州市| 墨玉县| 运城市| 高雄市| 红河县| 临邑县| 新安县| 宣化县| 牟定县| 莒南县| 英吉沙县|