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?,最后需要的是拿到MiaohshaUser對(duì)象,在程序的實(shí)際編寫過程中,會(huì)有許多方法需要經(jīng)過這樣的過程獲取到該對(duì)象,如何精簡下代碼,在入?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)文章
Java中生成隨機(jī)數(shù)的4種方式與區(qū)別詳解
生成隨機(jī)數(shù)是我們?nèi)粘i_發(fā)經(jīng)常會(huì)遇到的一個(gè)功能,這篇文章主要給大家介紹了關(guān)于Java中生成隨機(jī)數(shù)的4種方式與區(qū)別、應(yīng)用場景的相關(guān)資料,4個(gè)方式分別是Random、ThreadLocalRandom、SecureRandom以及Math,需要的朋友可以參考下2021-06-06
SpringMVC框架實(shí)現(xiàn)Handler處理器的三種寫法
這篇文章主要介紹了SpringMVC框架實(shí)現(xiàn)Handler處理器的三種寫法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
實(shí)例詳解MyBatis-plus自動(dòng)填充功能
每次對(duì)數(shù)據(jù)進(jìn)行新增、刪除、修改時(shí)都需要對(duì)這些字段進(jìn)行設(shè)置,雖然新增時(shí)間和修改時(shí)間可以使用數(shù)據(jù)庫的時(shí)間,但是新增人和修改人就不能使用這樣的功能,下面小編給大家介紹下MyBatis-plus自動(dòng)填充功能的實(shí)例代碼,感興趣的朋友一起看看吧2022-01-01
Spring MVC 處理Ajax請(qǐng)求的方式詳解
本文介紹了在SpringMVC中處理Ajax請(qǐng)求的方法,主要依賴于Controller和返回類型的配置,使用@RequestMapping注解處理Ajax的控制器方法,本文給大家介紹Spring MVC 處理Ajax請(qǐng)求的方式,感興趣的朋友跟隨小編一起看看吧2024-09-09
springboot + vue 實(shí)現(xiàn)遞歸生成多級(jí)菜單(實(shí)例代碼)
這篇文章主要介紹了springboot + vue 實(shí)現(xiàn)遞歸生成多級(jí)菜單,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12

