SpringBoot中通過實現WebMvcConfigurer完成參數校驗


在Spring5.0和SpringBoot2.0中廢棄了WebMvcConfigurerAdapter類。

現有兩種解決方案

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;
}
}
---------------------
作者:hhsway
來源:CSDN
原文:https://blog.csdn.net/qq_38439885/article/details/80238813
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM