最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 攔截器和自定義注解判斷請(qǐng)求是否合法

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

應(yīng)用場(chǎng)景舉例:

當(dāng)不同身份的用戶請(qǐng)求一個(gè)接口時(shí),用來校驗(yàn)用戶某些身份,這樣可以對(duì)單個(gè)字段數(shù)據(jù)進(jìn)行精確權(quán)限控制,具體看代碼注釋

自定義注解

/**
 * 對(duì)比請(qǐng)求的用戶身份是否符合
 * @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ù)手機(jī)號(hào)來刪除用戶")
  @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為需要,
   * 并會(huì)去調(diào)用下面的方法resolveArgument。
   */
  @Override
  public boolean supportsParameter(MethodParameter parameter) {
    //只處理CurrentUser注解修飾的參數(shù)
    return parameter.hasParameterAnnotation(CompareUser.class);
  }

  /**
   * 對(duì)比用戶信息
   */
  @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() + "]");
    }

    /*
     * 獲取要驗(yàn)證的字段名
     */

    //檢查是否給字段取了別名
    String paramName = "".equalsIgnoreCase(parameterAnnotation.name()) ? parameterAnnotation.value() : parameterAnnotation.name();
    if ("".equalsIgnoreCase(parameterAnnotation.name())) {
      //從參數(shù)中獲取定義的字段名
      paramName = parameter.getParameter().getName();
    }

    //獲取請(qǐng)求字段的值
    String paramValue = String.valueOf(webRequest.getParameter(paramName));

    //從請(qǐng)求頭中獲取已經(jīng)登錄的用戶
    String userName = webRequest.getHeader(AuthConstant.USER_TOKEN_HEADER);

    //對(duì)于root用戶,可以操作一切,所以直接返回
    if (!AuthConstant.ROOT_USER.equals(userName)) {
      //判斷身份是否一致,不一致就拋出異常,讓RestControllerAdvice處理
      if (userName == null || !userName.equals(paramValue)) {
        throw new NotSameAuthorException();
      }
    }
    //將參數(shù)原封不動(dòng)返回出去,需要還原回需要的類型
    WebDataBinder binder = binderFactory.createBinder(webRequest, parameterType, paramName);
    return binder.convertIfNecessary(paramValue, parameterType, parameter);
  }
}

配置WebMvcConfigurer

注意這里提供了兩種方式加載,因?yàn)?/p>

@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)先級(jí)最低,所以會(huì)失效,
  // 解決方案是下面的 @PostConstruct ,把優(yōu)先級(jí)調(diào)最高
  // 但是這樣@PathParam @RequestParam就失效了,@CompareUser(value="xxx")可以完全替換@RequestParam功能
//  @Override
//  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
//    resolvers.add(currentUserInterceptor);
//
//  }

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

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

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

效果

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

以上就是SpringBoot 攔截器和自定義注解判斷請(qǐng)求是否合法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot 攔截器和自定義注解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在Spring異步調(diào)用中傳遞上下文的方法

    在Spring異步調(diào)用中傳遞上下文的方法

    這篇文章主要給大家介紹了關(guān)于如何在Spring異步調(diào)用中傳遞上下文的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Scala實(shí)現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼

    Scala實(shí)現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼

    這篇文章主要介紹了Scala實(shí)現(xiàn)冒泡排序、歸并排序和快速排序的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-06-06
  • idea安裝hsdis的方法

    idea安裝hsdis的方法

    這篇文章主要介紹了idea安裝hsdis,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot實(shí)現(xiàn)動(dòng)態(tài)多線程并發(fā)定時(shí)任務(wù)

    SpringBoot實(shí)現(xiàn)動(dòng)態(tài)多線程并發(fā)定時(shí)任務(wù)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)動(dòng)態(tài)多線程并發(fā)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Springboot?2.x?RabbitTemplate默認(rèn)消息持久化的原因解析

    Springboot?2.x?RabbitTemplate默認(rèn)消息持久化的原因解析

    這篇文章主要介紹了Springboot?2.x?RabbitTemplate默認(rèn)消息持久化的原因解析,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Java使用SFTP上傳文件到服務(wù)器的簡(jiǎn)單使用

    Java使用SFTP上傳文件到服務(wù)器的簡(jiǎn)單使用

    這篇文章主要介紹了Java使用SFTP上傳文件到服務(wù)器的簡(jiǎn)單使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Java實(shí)現(xiàn)文件圖片的預(yù)覽和下載功能

    Java實(shí)現(xiàn)文件圖片的預(yù)覽和下載功能

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)文件圖片的預(yù)覽和下載功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • java聊天室的實(shí)現(xiàn)代碼

    java聊天室的實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java聊天室的實(shí)現(xiàn)代碼,一個(gè)多客戶端聊天室,支持多客戶端聊天,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Mybatis CURD及模糊查詢功能的實(shí)現(xiàn)

    Mybatis CURD及模糊查詢功能的實(shí)現(xiàn)

    這篇文章主要介紹了Mybatis CURD及模糊查詢功能的實(shí)現(xiàn),有查詢刪除,插入,更新功能,通過實(shí)例代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-06-06
  • SpringBoot集成SFTP客戶端實(shí)現(xiàn)文件上傳下載實(shí)例

    SpringBoot集成SFTP客戶端實(shí)現(xiàn)文件上傳下載實(shí)例

    這篇文章主要為大家介紹了SpringBoot集成SFTP客戶端實(shí)現(xiàn)文件上傳下載實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論

云林县| 油尖旺区| 安义县| 苏尼特右旗| 仁怀市| 临西县| 双鸭山市| 志丹县| 长治市| 从化市| 廉江市| 元阳县| 翁源县| 涪陵区| 五家渠市| 龙州县| 富平县| 上栗县| 孝感市| 甘德县| 房产| 金寨县| 双流县| 浙江省| 鹤壁市| 万宁市| 正阳县| 郎溪县| 通渭县| 施甸县| 布拖县| 琼结县| 泰安市| 同仁县| 广安市| 万安县| 泰兴市| 龙胜| 仪陇县| 桐乡市| 武陟县|