SpringBoot中通過實(shí)現(xiàn)WebMvcConfigurer參數(shù)校驗(yàn)的方法示例
在Spring5.0和SpringBoot2.0中廢棄了WebMvcConfigurerAdapter類。
現(xiàn)有兩種解決方案
1 直接實(shí)現(xiàn)WebMvcConfigurer (官方推薦)
2 直接繼承WebMvcConfigurationSupport
本篇文章討論下使用第一種方式完成參數(shù)校驗(yàn)。
首先附上代碼。
@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需要實(shí)現(xiàn)的功能是在cookie或requestParam中獲取到token,通過token去redis中獲取詳細(xì)的用戶信息,再將用戶信息放到頁面進(jìn)行展示。上面?zhèn)鹘y(tǒng)的方式入?yún)⒂蟹浅6啵詈笮枰氖悄玫組iaohshaUser對(duì)象,在程序的實(shí)際編寫過程中,會(huì)有許多方法需要經(jīng)過這樣的過程獲取到該對(duì)象,如何精簡(jiǎn)下代碼,在入?yún)⒅挥行枰@取的對(duì)象的時(shí)候,經(jīng)過一系列的操作從cookie拿到token以及redis獲取具體對(duì)象呢?
下面通過實(shí)現(xiàn)WebMvcConfigurer接口來實(shí)現(xiàn)。
/** * @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); } }
新建一個(gè)WebConfig類實(shí)現(xiàn)WebMvcConfigurer接口,WebMvcConfigurer是一個(gè)攔截器,里面有非常多的方法,我們用到的是addArgumentResolvers方法。需要注意的是類頭需要加上@Configuration注解將該類交給spring管理。
addArgumentResolvers具體內(nèi)容后文會(huì)提到。
新建UserArgumentResolver類實(shí)現(xiàn)HandlerMethodArgumentResolver接口
實(shí)現(xiàn)HandlerMethodArgumentResolver接口需要重寫supportsParameter方法和resolveArgument方法。
resolveArgument中從cookie或requestparam中獲取token值,并從redis中查詢到具體的MiaoshaUser信息并返回。
UserArgumentResolver類編寫完成后,在上面的WebConfig類中的addArgumentResolvers方法中將UserArgumentResolver類的實(shí)例添加進(jìn)argumentResolvers參數(shù)中即可。
這兩個(gè)類完成后,controller類中的toList方法如第一段注釋代碼所示。
/** * @author hsw * @Date 10:25 2018/5/8 */ @Service public class UserArgumentResolver implements HandlerMethodArgumentResolver { @Autowired MiaoshaUserService userService; /* * Miaoshauser類做參數(shù)校驗(yàn) * @author hsw * @date 2018/5/8 10:49 * @param [methodParameter] * @return boolean */ @Override public boolean supportsParameter(MethodParameter methodParameter) { Class<?> clazz = methodParameter.getParameterType();//如若不是MiaoshaUser類不進(jìn)行接下來操作 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查詢?cè)敿?xì)信息并返回,返回類為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; } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法
這篇文章主要介紹了SpringBoot應(yīng)用War包形式部署到外部Tomcat的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Java實(shí)現(xiàn)導(dǎo)出ZIP壓縮包的方法
這篇文章主要介紹了Java實(shí)現(xiàn)導(dǎo)出ZIP壓縮包的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動(dòng)態(tài)顯示進(jìn)度實(shí)例
本篇文章主要介紹了JavaWeb項(xiàng)目實(shí)現(xiàn)文件上傳動(dòng)態(tài)顯示進(jìn)度實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法實(shí)例分析
這篇文章主要介紹了Java程序流程控制:判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)原理與用法,結(jié)合實(shí)例形式分析了Java流程控制中判斷結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)相關(guān)原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04利用Log4j將不同Package的日志輸出到不同文件的方法
日志是應(yīng)用軟件中不可缺少的部分,Apache的開源項(xiàng)目log4j是一個(gè)功能強(qiáng)大的日志組件,提供方便的日志記錄。這篇文章主要介紹了利用Log4j將不同Package的日志輸出到不同文件的方法,需要的朋友可以參考借鑒,下面來跟著小編一起學(xué)習(xí)學(xué)習(xí)吧。2017-01-01