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; } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。