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

溫馨提示×

溫馨提示×

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

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

怎么在SpringBoot中利用WebMvcConfigurer實現參數校驗

發布時間:2021-04-14 16:16:44 來源:億速云 閱讀:145 作者:Leah 欄目:編程語言

怎么在SpringBoot中利用WebMvcConfigurer實現參數校驗?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

現有兩種解決方案

1 直接實現WebMvcConfigurer (官方推薦)
2 直接繼承WebMvcConfigurationSupport

本篇文章討論下使用第一種方式完成參數校驗。

首先附上代碼。

@Slf4j
@Controller
@RequestMapping("/goods")
public class GoodsController {
 
  @Autowired
  MiaoshaUserService miaoshaUserService;
 
 
//  @GetMapping("/to_list")
//  public String toList(Model model, MiaoshaUser miaoshaUser) {
//    model.addAttribute("miaoshaUser",miaoshaUser);
//    return "list";
//  }
 
 
  @GetMapping("/to_list")
  public String toList(Model model,
             HttpServletResponse response,
             @CookieValue(value = MiaoshaUserServiceImpl.COOKIE_NAME_TOKEN,required = false)String cookieToken,
             @RequestParam(value = MiaoshaUserServiceImpl.COOKIE_NAME_TOKEN,required = false)String paramToken) {
    if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)){
      return "login";
    }
    String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
    MiaoshaUser miaoshaUser = miaoshaUserService.getByToken(response,token);
    model.addAttribute("miaoshaUser",miaoshaUser);
    return "list";
  }
 
}

toList需要實現的功能是在cookie或requestParam中獲取到token,通過token去redis中獲取詳細的用戶信息,再將用戶信息放到頁面進行展示。上面傳統的方式入參有非常多,最后需要的是拿到MiaohshaUser對象,在程序的實際編寫過程中,會有許多方法需要經過這樣的過程獲取到該對象,如何精簡下代碼,在入參只有需要獲取的對象的時候,經過一系列的操作從cookie拿到token以及redis獲取具體對象呢?

下面通過實現WebMvcConfigurer接口來實現。

/**
 * @author hsw
 * @Date 10:12 2018/5/8
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
 
  @Autowired
  UserArgumentResolver userArgumentResolver;
 
  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    argumentResolvers.add(userArgumentResolver);
  }
 
}

新建一個WebConfig類實現WebMvcConfigurer接口,WebMvcConfigurer是一個攔截器,里面有非常多的方法,我們用到的是addArgumentResolvers方法。需要注意的是類頭需要加上@Configuration注解將該類交給spring管理。

addArgumentResolvers具體內容后文會提到。

新建UserArgumentResolver類實現HandlerMethodArgumentResolver接口

實現HandlerMethodArgumentResolver接口需要重寫supportsParameter方法和resolveArgument方法。

resolveArgument中從cookie或requestparam中獲取token值,并從redis中查詢到具體的MiaoshaUser信息并返回。

UserArgumentResolver類編寫完成后,在上面的WebConfig類中的addArgumentResolvers方法中將UserArgumentResolver類的實例添加進argumentResolvers參數中即可。

這兩個類完成后,controller類中的toList方法如第一段注釋代碼所示。

/**
 * @author hsw
 * @Date 10:25 2018/5/8
 */
@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
 
  @Autowired
  MiaoshaUserService userService;
 
  /*
   * Miaoshauser類做參數校驗
   * @author hsw
   * @date 2018/5/8 10:49
   * @param [methodParameter]
   * @return boolean
   */
  @Override
  public boolean supportsParameter(MethodParameter methodParameter) {
    Class<?> clazz = methodParameter.getParameterType();//如若不是MiaoshaUser類不進行接下來操作
    return clazz == MiaoshaUser.class;
  }
 
  @Override
  public Object resolveArgument(MethodParameter methodParameter,
                 ModelAndViewContainer modelAndViewContainer,
                 NativeWebRequest nativeWebRequest,
                 WebDataBinderFactory webDataBinderFactory) throws Exception {
    HttpServletRequest request =nativeWebRequest.getNativeRequest(HttpServletRequest.class);//獲取HttpServletRequest
    HttpServletResponse response =nativeWebRequest.getNativeResponse(HttpServletResponse.class);//獲取HttpServletResponse 
 
    String paramToken = request.getParameter(MiaoshaUserServiceImpl.COOKIE_NAME_TOKEN);
    String cookieToken = getCookieValue(request,MiaoshaUserServiceImpl.COOKIE_NAME_TOKEN);
    if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)){
      return null;
    }
 
    String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
    return userService.getByToken(response,token);//通過token查詢詳細信息并返回,返回類為MiaoshaUser
  }
 
  private String getCookieValue(HttpServletRequest request, String cookieName) {
    Cookie[] cookies = request.getCookies();
    for(Cookie cookie:cookies){
      if(cookie.getName().equals(cookieName)){
        return cookie.getValue();
      }
    }
    return null;
  }
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

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

AI

宽城| 凤台县| 习水县| 霞浦县| 沾化县| 方城县| 白山市| 乌兰浩特市| 永嘉县| 元谋县| 蓬莱市| 和田市| 巴林左旗| 页游| 常德市| 福贡县| 循化| 微博| 宝应县| 孟州市| 文登市| 常宁市| 江北区| 浦县| 西林县| 濮阳市| 池州市| 沂源县| 怀远县| 岚皋县| 岳阳市| 高阳县| 炉霍县| 万年县| 刚察县| 黄梅县| 清原| 招远市| 军事| 漳州市| 灌阳县|