SpringBoot2.0针对请求参数@RequestBody验证统一拦截
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验证统一拦截的更多相关文章
- SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景
一.拦截器简介 1.拦截器定义 拦截器,请求的接口被访问之前,进行拦截然后在之前或之后加入某些操作.拦截是AOP的一种实现策略. 拦截器主要用来按照指定规则拒绝请求. 2.拦截器中应用 Token令牌 ...
- Spring注解之Controller中获取请求参数及验证使用
1.处理request的uri部分的参数:@PathVariable. 2.处理request header部分的参数:@RequestHeader,@CookieValue@RequestHeade ...
- 表单验证:$tablePrefix(定义表前缀);$trueTableName = 'yonghu',找到真实表名(yonghu)表;create($attr,0)两个参数;批量验证(返回数组);ajax+动态验证表单
*$tablePrefix是定义在Model中的,优先级大于配置文件中,如果项目中表前缀全部比如为"a_",并且在配置文件中定义了 'DB_PREFIX'=>'a_' 后期如 ...
- 使用Filter对POST和GET方式的请求参数的进行统一解码
一.过滤器 二.自定义request类
- 使用getParameterMap()方法实现对请求参数的封装的工具类
我们知道,HttpServletRequest这个类的getParameter(name),getParameterValues(name)可以分别实现对页面传来的单个参数和对多个同名参数的接受.特别 ...
- Android拦截并获取WebView内部POST请求参数
起因: 有些时候自家APP中嵌入的H5页面并不是自家的.但是很多时候又想在H5不知情的情况下获取H5内部请求的参数,这应该怎么做到呢? 带着这个疑问,就有了这篇博客. 实现过程: 方案一: 最开始想到 ...
- 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值
[SpringCloud]Gateway 配置全局过滤器获取请求参数和响应值 实现Ordered接口getOrder()方法,数值越小越靠前执行,记得这一点就OK了. 获取请求参数RequestBod ...
- Springboot2.0整合Redis(注解开发)
一. pom.xm文件引入对应jar包 <dependency> <groupId>org.springframework.boot</groupId> <a ...
- 自动化CodeReview - ASP.NET Core请求参数验证
自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 参数验证实现 在做服务端开发 ...
随机推荐
- html-div+span-4
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [洛谷P1063][NOIP2006]能量项链
区间DP模板题 题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗 ...
- am335x uboot2016.05 (MLO u-boot.img)执行流程(转)
am335x的cpu上电后,执行流程:ROM->MLO(SPL)->u-boot.img 第一级bootloader:引导加载程序,板子上电后会自动执行这些代码,如启动方式(SDcard. ...
- Summary
PDF 暑假开始准备转移博客,试了几个都不怎么满意(我还去试了下LineBlog 不知道那时候在想什么..),屯着一堆文章,,到时候一起发了 现在暂时转移至WordPress,不过还在完善中,预计.. ...
- Xamarin Essentials教程屏幕状态DeviceDisplay
Xamarin Essentials教程屏幕状态DeviceDisplay 由于移动设备型号众多,采用的显示屏幕也千差万别.为了获取较好的显示效果,应用程序往往需要获取设备的显示状态,如屏幕参数. ...
- Linux之经典互联网架构
经典互联网架构 netstat -tulnp |grep 80ss -tulnp|grep 80 前期铺垫: 1. Linux要能上网2. 掌握Linux软件包安装方法2.1 rpm包管理 2.1.1 ...
- [Vijos1763]Wormhole (贪心/模拟?)
已经是NOIP考前的最后一天了 现在在杭州的宾馆里 因为自己没带电脑 因此用ADMAN的电脑 题目描述 一维的世界就是一个数轴.这个世界的狭小我们几乎无法想象. 在这个数轴上,有N个点.从左到右依次标 ...
- Android 中的设计模式
1.单例模式 ContentProvider是单例模式,多个ContentResolver操作的都是同一个ContentProvider.
- unity仿微信飞机大战项目
开发路线: 1,游戏背景(连续播放) 2,添加主角 3,设置游戏主角的动画 4,添加两种子弹并设置子弹的运动 5,添加三种子弹 设置子弹的自动生成和运动 6,添加两种奖励物品 设置奖励物品的自动生成和 ...
- java代码发送邮箱验证码与qq邮箱smtp服务
发送邮箱的类封装,在此之前需要一个jar包 javax.mail.jar 下载链接https://github.com/javaee/javamail/releases/download/JAVAM ...