title: "SpringBoot2.0针对请求参数@RequestBody验证的统一拦截"
categories: SpringBoot2.0 Shiro
tags: SpringBoot2.0 Shiro

author: LIUREN

SpringBoot2.0针对请求参数@RequestBody验证统一拦截

针对SpringBoot2中请求参数统一进行拦截处理问题

第一步:建立请求实体类RequetsUserEntity.java

RequetsUserEntity.java

/**
 * @Title: RequetsUserEntity.java
 * @Package io.renren.modules.wx.vo
 * @Description: 
 * Copyright: Copyright (c) 2019 www.codepeople.cn Inc. All rights reserved. 
 * Website: www.codepeople.cn 
 * @Author 刘仁
 * @DateTime 2019年4月12日 上午9:28:53
 * @version V1.0
 */ package io.renren.modules.wx.vo; import java.io.Serializable; import javax.validation.constraints.NotBlank; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; /**
 * @ClassName: RequetsUserEntity
 * @Description: 
 * @Author 刘仁
 * @DateTime 2019年4月12日 上午9:28:53 
 */
@Data
@ApiModel(description = "RequetsUserEntity")
public class RequetsUserEntity implements Serializable{     private static final long serialVersionUID = 8841143276870083920L;
    /**
     * appid
     */
    @ApiModelProperty(value = "appid")
    @NotBlank(message="不能为空")
    private String appid;
    /**
     * code
     */
    @ApiModelProperty(value = "code")
    @NotBlank(message="不能为空")
    private String code;
    /**
     * nickName
     */
    @ApiModelProperty(value = "微信昵称")
    @NotBlank(message="不能为空")
    private String nickName;
    /**
     * 0未知  1男性  2女性
     */
    @ApiModelProperty(value = "0未知  1男性  2女性")
    @NotBlank(message="不能为空")
    private String gender;
    /**
     * en英文 zh_CN简体中文   zh_TW繁体中文
     */
    @ApiModelProperty(value = "en英文 zh_CN简体中文   zh_TW繁体中文")
    private String language;
    /**
     * 用户所在城市
     */
    @ApiModelProperty(value = "用户所在城市")
    private String city;
    /**
     * 用户所在省份
     */
    @ApiModelProperty(value = "用户所在省份")
    private String province;
    /**
     * 用户所在国家
     */
    @ApiModelProperty(value = "用户所在国家")
    private String country;
    /**
     * 用户头像图片的 URL
     */
    @ApiModelProperty(value = "用户头像图片的 URL")
    private String avatarUrl;
    /**
     * 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,详见 用户数据的签名验证和加解密
     */
    @ApiModelProperty(value = "signature")
    @NotBlank(message="不能为空")
    private String signature;
    /**
     * 不包括敏感信息的原始数据字符串,用于计算签名
     */
    @ApiModelProperty(value = "rawData")
    @NotBlank(message="不能为空")
    private String rawData;
    /**
     * 包括敏感数据在内的完整用户信息的加密数据,详见 用户数据的签名验证和加解密
     */
    @ApiModelProperty(value = "encryptedData")
    @NotBlank(message="不能为空")
    private String encryptedData;
    /**
     * 加密算法的初始向量,详见 用户数据的签名验证和加解密
     */
    @ApiModelProperty(value = "iv")
    @NotBlank(message="不能为空")
    private String iv;
    /**
     * 登录类型 1 微信医生端小程序 2微信用户端小程序 3微网站 4手机app 5微信公众号
     */
    @ApiModelProperty(value = "1 微信医生端小程序 2微信用户端小程序 3微网站 4手机app 5微信公众号")
    @NotBlank(message="不能为空")
    private String loginType;  }

第二步:建立Controller进行验证

LoginController.java

/**
 * @Title: WxLoginController.java
 * @Package io.renren.modules.wx.controller
 * @Description: 
 * Copyright: Copyright (c) 2019 www.codepeople.cn Inc. All rights reserved. 
 * Website: www.codepeople.cn
 * @Author 刘仁
 * @DateTime 2019年4月3日 下午3:34:44
 * @version V1.0
 */ package io.renren.modules.wx.controller; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import io.renren.common.utils.R;
import io.renren.modules.wx.vo.RequetsUserEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; /**
 * @ClassName: LoginController
 * @Description:
 * @Author 刘仁
 * @DateTime 2019年4月3日 下午3:34:44
 */
@Api(tags = "微信小程序授权登录接口")
@RestController
@RequestMapping("/wx/user/{appid}")
@Slf4j
public class LoginController {     @ApiOperation("微信小程序授权登录")
    @PostMapping("/login")
    public R login(@Validated @RequestBody RequetsUserEntity req) {
        // TODO 实现自己的业务
        log.info("登录成功");
        return R.ok("登录成功");
    } }

第三步:设置全局异常进行拦截

RRExceptionHandler.java

/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有,侵权必究!
 */ package io.renren.common.exception; import org.apache.shiro.authz.AuthorizationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.http.HttpStatus;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice; import io.renren.common.utils.R; /**
 * 异常处理器
 *
 * @author Mark sunlightcs@gmail.com
 */
@RestControllerAdvice
public class RRExceptionHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());     /**
     * 处理自定义异常
     */
    @ExceptionHandler(RRException.class)
    public R handleRRException(RRException e){
        R r = new R();
        r.put("code", e.getCode());
        r.put("msg", e.getMessage());         return r;
    }     @ExceptionHandler(DuplicateKeyException.class)
    public R handleDuplicateKeyException(DuplicateKeyException e){
        logger.error(e.getMessage(), e);
        return R.error("数据库中已存在该记录");
    }     @ExceptionHandler(AuthorizationException.class)
    public R handleAuthorizationException(AuthorizationException e){
        logger.error(e.getMessage(), e);
        return R.error("没有权限,请联系管理员授权");
    }     @ExceptionHandler(Exception.class)
    public R handleException(Exception e){
        logger.error(e.getMessage(), e);
        return R.error();
    }     @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public R validationError(MethodArgumentNotValidException ex) {
        FieldError fieldError = ex.getBindingResult().getFieldError();
        logger.error(fieldError.getField()+fieldError.getDefaultMessage());
        return R.error(9999, fieldError.getField()+fieldError.getDefaultMessage());
    }
}

第四步:然后运行SpringBoot项目发送http请求,获取返回信息

第五步:针对R.java类信息如下

R.java

/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有,侵权必究!
 */ package io.renren.common.utils; import java.util.HashMap;
import java.util.Map; /**
 * 返回数据
 *
 * @author Mark sunlightcs@gmail.com
 */
public class R extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;     public R() {
        put("code", 0);
        put("msg", "success");
    }     public static R error() {
        return error(500, "未知异常,请联系管理员");
    }     public static R error(String msg) {
        return error(500, msg);
    }     public static R error(int code, String msg) {
        R r = new R();
        r.put("code", code);
        r.put("msg", msg);
        return r;
    }     public static R ok(String msg) {
        R r = new R();
        r.put("msg", msg);
        return r;
    }     public static R ok(Map<String, Object> map) {
        R r = new R();
        r.putAll(map);
        return r;
    }     public static R ok() {
        return new R();
    }     @Override
    public R put(String key, Object value) {
        super.put(key, value);
        return this;
    }
}

==================================================================

博客地址https://www.codepeople.cn

==================================================================

SpringBoot2.0针对请求参数@RequestBody验证统一拦截的更多相关文章

  1. SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景

    一.拦截器简介 1.拦截器定义 拦截器,请求的接口被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 拦截器主要用来按照指定规则拒绝请求. 2.拦截器中应用 Token令牌 ...

  2. Spring注解之Controller中获取请求参数及验证使用

    1.处理request的uri部分的参数:@PathVariable. 2.处理request header部分的参数:@RequestHeader,@CookieValue@RequestHeade ...

  3. 表单验证:$tablePrefix(定义表前缀);$trueTableName = 'yonghu',找到真实表名(yonghu)表;create($attr,0)两个参数;批量验证(返回数组);ajax+动态验证表单

    *$tablePrefix是定义在Model中的,优先级大于配置文件中,如果项目中表前缀全部比如为"a_",并且在配置文件中定义了 'DB_PREFIX'=>'a_' 后期如 ...

  4. 使用Filter对POST和GET方式的请求参数的进行统一解码

    一.过滤器 二.自定义request类

  5. 使用getParameterMap()方法实现对请求参数的封装的工具类

    我们知道,HttpServletRequest这个类的getParameter(name),getParameterValues(name)可以分别实现对页面传来的单个参数和对多个同名参数的接受.特别 ...

  6. Android拦截并获取WebView内部POST请求参数

    起因: 有些时候自家APP中嵌入的H5页面并不是自家的.但是很多时候又想在H5不知情的情况下获取H5内部请求的参数,这应该怎么做到呢? 带着这个疑问,就有了这篇博客. 实现过程: 方案一: 最开始想到 ...

  7. 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值

    [SpringCloud]Gateway 配置全局过滤器获取请求参数和响应值 实现Ordered接口getOrder()方法,数值越小越靠前执行,记得这一点就OK了. 获取请求参数RequestBod ...

  8. Springboot2.0整合Redis(注解开发)

    一. pom.xm文件引入对应jar包 <dependency> <groupId>org.springframework.boot</groupId> <a ...

  9. 自动化CodeReview - ASP.NET Core请求参数验证

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 参数验证实现 在做服务端开发 ...

随机推荐

  1. java.io.File中字段的使用

    File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:Java   -cp   test.jar;abc.jar   HelloWorld就是指“;” File.separa ...

  2. gevent实现基于epoll和协程的服务器

    1. 导gevent中的猴子补丁,来把原来python自带的socket变成基于epoll的socket(解除阻塞问题) 代码: # from gevent import monkey;monkey. ...

  3. js获取http请求响应头信息

    var req = new XMLHttpRequest(); req.open('GET', document.location, false); req.send(null); var heade ...

  4. BZOJ-7-2655: calc-DP-拉格朗日插值

    https://www.lydsy.com/JudgeOnline/problem.php?id=2655 以上是对 dp 一小部分打的表.dp[ i ] [ j ]  含义为 前 i 个 数 中 选 ...

  5. C - Visible Trees HDU - 2841 -莫比乌斯函数-容斥

    C - Visible Trees HDU - 2841 思路 :被挡住的那些点(x , y)肯定是 x 与 y不互质.能够由其他坐标的倍数表示,所以就转化成了求那些点 x,y互质 也就是在 1 - ...

  6. 向量图兼容组件VectorCompat

    向量图兼容组件VectorCompat Android从5.0(API Level 21)开始,支持矢量图和动画矢量图.采用这两种图,可以避免传统图片因为缩放而产生失真.VectorCompat组件是 ...

  7. JavaScript基础笔记(八)DOM扩展

    DOM扩展 一.选择符API Selectors API是由W3C发起制定的一个标准,致力于让浏览器原生支持CSS查询. 一)querySelector() 在Document和Element类型实例 ...

  8. 【开源GPS追踪】 之 为何费力不讨好

    GPS追踪,在X宝上一搜一大堆,价格几十到几百层次不齐,为何还要自己开发? 1 对我来说,就是手头有这些硬件资源(GPRS GPS MCU)以及软件资源(VPS),算闲的蛋疼,其实不然,本人工作也很忙 ...

  9. 潭州课堂25班:Ph201805201 爬虫高级 第十二 课 Scrapy-redis分布 项目实战 (课堂笔记)

    建代理池, 1,获取多个网站的免费代理IP, 2,对免费代理进行检测,>>>>>携带IP进行请求, 3,检测到的可用IP进行存储, 4,实现api接口,方便调用, 5,各 ...

  10. linux环境下mongodb启动操作

    pkill mongod 进入mongo shell :运行 db.shutdownServer() 1.进入mongo的shell  : mongo --port 1008 2.进入bin目录下 m ...