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

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

現有兩種解決方案redis

1 直接實現WebMvcConfigurer (官方推薦)
2 直接繼承WebMvcConfigurationSupport
本篇文章討論下使用第一種方式完成參數校驗。spring

首先附上代碼。cookie

@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獲取具體對象呢?app

下面經過實現WebMvcConfigurer接口來實現。ide

/**
* @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管理。ui

addArgumentResolvers具體內容後文會提到。.net


新建UserArgumentResolver類實現HandlerMethodArgumentResolver接口對象

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

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

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

 

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

/** * @author hsw * @Date 10:25 2018/5/8 */@Servicepublic 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 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索