SpringMVC校验数据方式总结(含示例源码)

SpringMVC对于提交表单(form submit)的数据校验与异常信息回显,个人常用有两种方式

方式一:使用Validator接口,实现Validator接口并编写校验的代码,

1

Validator是一个单独类处理,示例源码链接:https://gitee.com/shengzhao/spring-oauth-server/tree/1.0/src/main/java/com/monkeyk/sos/web/controller

在使用时示例如下:

2

示例源码链接:https://gitee.com/shengzhao/spring-oauth-server/blob/1.0/src/main/java/com/monkeyk/sos/web/controller/UserController.java

此方式简单明了,validator与controller分开。

 

方式二:使用全注解,需要扩展实现一些业务需要的数据校验(此文重点)

不需要额外增加一个类来处理,注解加在Model对象属性中,

3

UserFormDto是一个Model对象,@Size, @NotBlank,@Length, @Email为 java validation API中定义的注解类型,

示例源码链接:https://gitee.com/mkk/MyOIDC/blob/1.1.0/myoidc-server/src/main/java/myoidc/server/service/dto/UserFormDto.java

@UsernameValidation 是扩展自定义实现的数据校验(主要增加业务逻辑,如此处username要求唯一),其具体实现为:

5

其实现的关键是 UsernameValidator.java的实现,如下:

6

UsernameValidator实现ConstraintValidatior接口并提供实现,在isValid()方法中实现具体业务逻辑,返回true表示校验成功

示例源码链接:https://gitee.com/mkk/MyOIDC/tree/1.1.0/myoidc-server/src/main/java/myoidc/server/service/validation

 

——————————–

对于表单校验异常后的展示,SpringMVC提供了一套页面标签实现,如果是JSP页面,示例如下:

8

示例源码链接:https://gitee.com/shengzhao/spring-oauth-server/blob/config/src/main/webapp/WEB-INF/jsp/user_form.jsp

如果是 SpringBoot中的 thymeleaf,示例如下:

7

示例源码链接:https://gitee.com/mkk/MyOIDC/blob/1.1.0/myoidc-server/src/main/webapp/WEB-INF/view/admin/user_form.html

(页面展示的标签方式有多种形式,可根据实际需要进行选择,如可以针对单个的字段进行异常显示)

 

浅层大脑皮层之思索

2.20  0:54  周四一大堆杂事工作,各类的不满意不经意不成长的人少些许是用心的,结束此日。

积极向前看,工作在多类事务并行而缺少过多的专注而言不衷己的心态,看书也是浅层大脑皮层在活动,且到了应该睡觉休息养身,一股冷意从空气中流传,下雨了的夜晚更多几分的愁意,思于无从坚持以每日写日记而想出记录每日睡觉时间保证能每日记录一行或几行在本子中,也如此坚持了最近几年的日记于今日,还继续写。

特殊年景的时日,疫情不会消失很快需跟上不断变化的光景且不断学习—-主要靠看书与工作中的接触。快了下周是有可能再次回来办公区办公楼,回归想要的传统生活节奏罢!

做菜三二支,爬上床被盖上被子,暖和地美美睡去而不便在9.00时起床方算美的早晨,可也只能静待周末的时光来临,每一日都一样都在小区里,不扩散不乱走,我不知,人不知病毒在隐藏中随时想发起的攻击,不堪一击的人类因转轮回没有主次,都于命中神中注定,无欲望有欲望控制不了的欲望,世间就是活不明白,都活不明白时也就打开潘多拉盒子推倒重来,轮转!

都是在没有疲倦地向前发展着,终点已经固定,无多的叫喊,思索,无望,离别等等一多多都是人的一番感情的展露罢。

2.21 0:40  周五,在家工作的类似最后一天也感受到上班那类感受:中午不睡,下午崩溃。去办健康证明(因为疫情),去洗车终于成功还免费消毒国内空间,干净的车子是好心情的一体会。

计划着的下周回到办公室开始2020继续的日子,虽说大可能继续等待着又一个14天的光景—-隔离时光;头发也理了,也洗澡了,做不完的工作压过头顶也得健康地顶着向前一直走—-此生活之工作真谛。

看了《人间失格》一书在晚上扒在床上,怕看得无法自拔而强迫自己睡觉,理智而合理,细水长流一般地关灯,上眼药水,然后真睡去。

 

2020-01-31,过了一个长长的春节假期

2020-01-31,农历正月初七,春节的第8天,宅在老家里,还剩下2天假期,明天准备返回工作城市。

村子里的广播一遍又一遍播放着病毒防疫的各类注意事项,这是生物病毒,不是电脑病毒,但比电脑病毒严重多了。远在西南偏远山区的小村庄,也受到影响。

这时刻,能深刻地感受到大家都在一起,一起抗战,一起需要口罩与防治措施,等等。

宅在家成了作个人贡献的重要环节,看着电视了解一切,都去当监工跟进,不添堵,不增加麻烦。

 

一种休息久了很需要工作才能满足的感觉油然而生,我们作好准备,迎接更可变的未来。

心态的积极面对,总会更好许多。

2020年阅读计划

阅读自有书,2020阅读计划

  1. 《Effective Java中文版(原书第3版)》2月
  2. 《持续交付:发布可靠软件的系统方法》
  3. 《鞋狗:耐克创始人菲尔.奈特亲笔自传》3月
  4. 《论人类不平等的起源和基础》
  5. 《新未来简史:区块链,人工智能,大数据陷阱与数字化生活》3月
  6. 《人间失格》2月
  7. 《企业IT架构转型之道》1月
  8. 《和谐拯救危机》
  9. 《演进式架构》
  10. 《暗网I:揭秘数字货币骗局》
  11. 《区块链 领导干部读本》
  12. 《译文纪实:血疫》
  13. 《基因,大脑和人类潜能》
  14. 《深入分布式缓存:从原理到实践》
  15. 《程序员必读之软件架构》4月
  16. 《程序员思维修炼(修订版)》
  17. 《深入理解Spring Cloud与微服务构建(第2版)》4月

 

 

——————————-

2019年阅读计划

2018年阅读计划

2017年阅读计划

2016年及之前所看之书

解决oauth_access_token表出现一个UserName有多条数据异常

在spring-oauth-server的ISSUE #IAI2E#IP5N9中提到的oauth_access_token表会出现多条相同username的数据的异常情况,

解决办法如下:

1.对 oauth_access_token 表的authentication_id 字段增加唯一索引,创建索引SQL如下:

ALTER TABLE oauth_access_token ADD UNIQUE INDEX authentication_id_unique_index(authentication_id);

若是新建数据库,则直接按照 spring-oauth-server开发要求运行SQL文件(initial_db.ddl)即可(创建表的SQL中已经加了唯一索引)

 

2.推荐使用将access token 数据存入redis来提升性能与解决此问题,详细请访问 http://andaily.com/blog/?p=19776

 

域名清单

monkeyk.com

andaily.com

shengzhaoli.com

wancunle.com

schqst.com

————–

kisso.net

sharego.net

idaas.net

————–

qiuchang8.cn

————–

monkeyk.cc

kisso.cc

wdcy.cc

————–

qc8.me

 

 

spring-oauth-server 2.0.1 发布,基于Spring-Boot2.x实现,向微服务靠拢

spring-oauth-server在2019-08-04更新发布了2.0.1版本,

此版本是使用Spring Boot重构实现后的第2个发布版本(2.0.0是第1个),更新内容如下:

  1. 将项目用视频方式讲解出来,更直观学习与掌握,视频链接http://list.youku.com/albumlist/show/id_51900110.html(不断更新中)
  2. Fix issue #IJO9R /oauth/rest_token 接口 client_secret字段没有校验
  3. Use spring-boot version to :   2.0.2.RELEASE
  4. 修改ROLE的错误配置
  5. 升级Spring Security OAuth版本为2.3.4.RELEASE
  6. 增加将AccessToken存入Redis的配置参考,提高读写性能
  7. 增加使用代码生成AccessToken功能

 

2.0.1分支链接:https://gitee.com/shengzhao/spring-oauth-server/tree/2.0.1/

spring-oauth-server

 

 

历史更新

 

如何通过代码生成AccessToken

在默认的OAuth2场景中,需要发送请求到 /oauth/token 响应AccessToken,这能满足大部分的需求;但在更复杂的场景中,比如在请求时需要传递更多的信息,如deviceId(设备ID),tenantId(租户ID)等,这时默认的实现就不满足要求,需要另写API来实现(同时传递OAuth2需要的参数,如client_id),在后台代码实现中,需要通过代码来生成AccessToken。

在spring-oauth-server的2.0.1版本中,增加了通过代码生成AccessToken的JAVA类,具体如下:

token-code

 

InlineAccessTokenInvoker.java  — 生成AccessToken的抽象类,提供许多公共方法实现;

ClientCredentialsInlineAccessTokenInvoker.java  — 生成grant_type=client_credentials 时的AccessToken类;

PasswordInlineAccessTokenInvoker.java  — 生成grant_type=password 时的AccessToken类;

RefreshTokenInlineAccessTokenInvoker.java — 生成grant_type=refresh_token 时的AccessToken类;

 

具体的使用示例可查看每个类的单元测试代码。一个示例如下:

demo-token-get

 

调用成功返回 AccessTokenDto 对象,若失败则会抛出OAuth2中的异常对象,如:InvalidGrantException。

 

相关阅读

处理/oauth/token与/oauth/authorize的Endpoint

 

spring-oauth-server