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;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Boot配置接口WebMvcConfigurer的实现

    WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制.基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口,WebMvcConfigurerAdapter 抽象类是对WebMvcConfigurer接口的简单抽象(增加了一些默认实现),但在在SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapt

  • SpringBoot中通过实现WebMvcConfigurer参数校验的方法示例

    在Spring5.0和SpringBoot2.0中废弃了WebMvcConfigurerAdapter类. 现有两种解决方案 1 直接实现WebMvcConfigurer (官方推荐) 2 直接继承WebMvcConfigurationSupport 本篇文章讨论下使用第一种方式完成参数校验. 首先附上代码. @Slf4j @Controller @RequestMapping("/goods") public class GoodsController { @Autowired Mi

  • SpringBoot中的异常处理与参数校验的方法实现

    兄弟们好,这次来跟老铁交流两个问题,异常和参数校验,在说参数校验之前我们先来说异常处理吧,因为后面参数的校验会牵扯到异常处理这块的内容. 异常处理 说到异常处理,我不知道大家有没有写过或者遇到过如下的写法. public void saveUser() { try { // 所有的业务内容,目测几百行 }catch (Exception e) { e.printStackTrace(); } } 如果出现上述的代码,里面包含了大量的业务代码,如果是你写的,赶紧改掉,不是你写的找写的,吐槽赶紧改掉

  • SpringBoot中自定义注解实现参数非空校验的示例

    前言 由于刚写项目不久,在写 web 后台接口时,经常会对前端传入的参数进行一些规则校验,如果入参较少还好,一旦需要校验的参数比较多,那么使用 if 校验会带来大量的重复性工作,并且代码看起来会非常冗余,所以我首先想到能否通过一些手段改进这点,让 Controller 层减少参数校验的冗余代码,提升代码的可阅读性. 经过阅读他人的代码,发现使用 annotation 注解是一个比较方便的手段,SpringBoot 自带的 @RequestParam 注解只会校验请求中该参数是否存在,但是该参数是

  • SpringBoot使用validation-api实现对枚举类参数校验的方法

    前言 之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-api自带的注解只能完成对空值.长度等简单的校验,在我们日常的使用当中会遇到对参数是否在枚举值类的校验,针对这种情况我们怎么来实现呢? SpringBoot使用validation-api实现参数校验可参考我的博客:SpringBoot使用validation-api实现参数校验 正文 SpringBoot使用validation-api实现对枚举类参数校验

  • Spring/Spring Boot 中优雅地做参数校验拒绝 if/else 参数校验

    数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据. 最普通的做法就像下面这样.我们通过 if/else 语句对请求的每一个参数一一校验. @RestController @RequestMapping("/api/person") public class PersonController { @PostMapping public ResponseEnti

  • SpringBoot参数校验的方法总结

    一.前言 在上一篇MyBatis-plus 初体验 中已经简单实现了 MyBatis-Plus 数据库查询.我们知道 CURD 离不开前后端的数据交互,因此参数校验是必不可少的.这篇主要讲一下 SpringBoot 参数校验. 在 Web 开发中经常需要对前端传过来的参数进行校验,例如格式校验.非空校验等,基本上每个接口都需要进行校验.如果使用常规的 IF ELSE 进行校验,随着参数越来越多,校验逻辑的冗余度也越来越高,导致维护性变差.在 Java 中定义了一套基于注解的数据校验规范 Bean

  • SpringBoot实现接口的各种参数校验的示例

    目录 1.添加依赖 2.接口参数校验 2.1 requestBody参数校验 2.2 requestParam/PathVariable参数校验 3.统一异常处理 4.进阶使用 4.1 分组校验 4.2 嵌套校验 4.3 集合校验 4.4 自定义校验 5.快速失败 (Fail Fast) 6.@Valid和@Validated区别 7.实现原理 7.1 requestBody参数校验实现原理 7.2 方法级别的参数校验实现原理 在我们进行接口开发时,在对参数的接收时,我们需要冗余复杂的校验规则

  • SpringBoot进行参数校验的方法详解

    目录 介绍 1.SpringBoot中集成参数校验 1.1引入依赖 1.2定义参数实体类 1.3定义校验类进行测试 1.4打开接口文档模拟提交数据 2.参数异常加入全局异常处理器 3.自定义参数校验 3.1创建自定义注解 3.2自定义校验逻辑 3.3在字段上增加注解 3.4体验效果 4.分组校验 4.1定义分组接口 4.2在模型中给参数分配分组 4.3体现效果 介绍 在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数进行校验,例如登录的时候需要校验用户名和密码是否为空,添加

  • SpringBoot通过自定义注解实现参数校验

    目录 1. 为什么要进行参数校验 2. 如何实现参数校验 3. 注解实现参数校验 4. 自定义注解实现参数校验 1. 为什么要进行参数校验 在后端进行工作时,需要接收前端传来的数据去数据库查询,但是如果有些数据过于离谱,我们就可以直接把它pass掉,不让这种垃圾数据接触数据库,减小数据库的压力. 有时候会有不安分的人通过一些垃圾数据攻击咱们的程序,让咱们的服务器或数据库崩溃,这种攻击虽然低级但不得不防,就像QQ进行登录请求时,它们向后端发送 账号=123,密码=123 的数据,一秒钟还发1w次,

  • Spring boot进行参数校验的方法实例详解

    Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空.整数值的范围.字符串的长度.日期.邮箱等等.Spring支持JSR-303 Bean Validation API,可以方便的进行校验. 使用注解进行校验 先定义一个form的封装对象 class RequestForm { @Size(min = 1, max = 5) private String name; public String getName() { return n

随机推荐