在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
版权声明:本文为博主原创文章,转载请附上博文链接!

SpringBoot中通过实现WebMvcConfigurer完成参数校验的更多相关文章

  1. 一起来学SpringBoot(十七)优雅的参数校验

    参数校验在开发中经常需要写一些字段校验的代码,比如字段非空,字段长度限制,邮箱格式验证等等,写这些与业务逻辑关系不大的代码个人感觉有两个麻烦: 验证代码繁琐,重复劳动方法内代码显得冗长每次要看哪些参数 ...

  2. SpringBoot中自定义properties文件配置参数并带有输入提示

    1. 创建配置类 在项目中创建一个参数映射类如下 @ConfigurationProperties(prefix = "user.info") public class MyPro ...

  3. SpringBoot 全局异常处理 @RestControllerAdvice +@ExceptionHandler 请求参数校验

    ControllerAdvice 指示带注释的类辅助“控制器”. 作为的特殊化@Component,允许通过类路径扫描自动检测实现类. 通常用于定义@ExceptionHandler, @InitBi ...

  4. 【springboot】@Valid参数校验

    转自: https://blog.csdn.net/cp026la/article/details/86495659 扯淡: 刚开始写代码的时候对参数的校验要么不做.要么写很多类似 if( xx == ...

  5. 如何从 if-else 的参数校验中解放出来?

    背景 在开发中经常需要写一些字段校验的代码,比如非空,长度限制,邮箱格式验证等等,导致充满了if-else 的代码,不仅相当冗长,而且很让人抓狂. hibernate validator(官方文档)提 ...

  6. Hibernate Validator参数校验

    日常开发中经常会遇到需要参数校验的情况,比如某个字段不能为空.长度不能超过5等都属于参数校验的范围.对于简单的参数校验通过写几个if-else判断语句就搞定,但是对于复杂的多个参数校验的情况,就不是那 ...

  7. 测试开发专题:如何在spring-boot中进行参数校验

    上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中 ...

  8. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

  9. SpringBoot 参数校验的方法

    Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...

随机推荐

  1. ZROI2018提高day1t1

    传送门 分析 在考场上我通过画图发现了对于n个点肯定用一个六边形围起来最优(假装四边形是特殊的六边形),我们发现可以将这个六边形分成两个梯形(梯形的高可以为0),然后我们便枚举两个梯形共同的底边和它们 ...

  2. vimrc 我的专属vim配置

    set nu set wrap syntax on filetype on "打开vim文件类型自动检测功能 set autoindent set smartindent set ruler ...

  3. Socket编程--TCP粘包问题

    TCP是个流协议,它存在粘包问题 产生粘包的原因是: TCP所传输的报文段有MSS的限制,如果套接字缓冲区的大小大于MSS,也会导致消息的分割发送. 由于链路层最大发送单元MTU,在IP层会进行数据的 ...

  4. 十三周作业—使用Metaspoit攻击MS08-067

    操作过程及结果如下:

  5. linux配置mysql主从复制

    1.准备工作,2台服务器都安装最好一个版本的mysql 主:192.168.100.1 从:192.168.100.2 a.修改主数据库/etc/my.cnf,mysqld下添加.修改之后重启. [m ...

  6. Educational Codeforces Round 60 (Rated for Div. 2)D(思维,DP,快速幂)

    #include <bits/stdc++.h>using namespace std;const long long mod = 1e9+7;unordered_map<long ...

  7. Python学习过程(二)

    条件判断和循环 条件判断 age = 20 if age >= 18: print 'your age is',age print 'adult' elif age >=6 : print ...

  8. 出现epoll failed: Bad file descriptor的原因

    今天遇到了这个问题,之前找了半天原来是IO事件的socket描述符在epoll_ctl()处理之前关闭了. if(epoll_ctl(epollFd, EPOLL_CTL_DEL, ev->fd ...

  9. luogu1900 自我数

    分享一个非正解的做法 本题解内存最低(\(\le1\rm MiB\)) 但是不开O2会tle 思路:每个数字仅会更新出1个新的数字,而且这个新数字比旧数字最多也就大70多.所以这里还是利用" ...

  10. 关于MVC模型的NSNotification用法

    对于iOS开发开发者, Model View Controller 模型能帮你快速理清开发思路,最近在使用Model给Controller传递数据时候了解了关于 NSNotification的一些用法 ...