二维码
移动端扫码求职登记,做有效性校验
1.客户需要在PC端自定义设置二维码的过期时间,生成二维码,打印二维码和控制二维码的过期时间
2.用户移动端扫码进行有效时间验证
3.由于需要控制二维码是否过期,可能提前过期等,过期时间需要存储在数据库表中,方便校验
综上所述:我们只需要一个生成组装二维码的值的方法 一个校验时间的方法即可
生成二维码编码
- 客户设置相关过期时间等参数信息传给后端生成code,并且存储进数据库表(编码,二维码名,过期时间,扩展:字段链接,是否提前过期)
- 后端生成二维码方法:构建二维码的参数信息,过期时间等,并进行加密
- 返回构建的链接+code 移动前端使用组件生成二维码
实际开发:由于存储在数据库表中,所以根据前端传来的ID,查询数据库表,获取到存储在数据库表的数据(唯一编码UUID url链接)
实际效果:https://url.html?code=1630287605372
code就是UUID 所以所谓的生成就是后端返回一条连接即可 url+uuid参数
不需要用过期时间做为参数 因为数据库中有, 既然没有过期时间也就不需要加密 ,因为像1630287605372本身就是类似于订单号的东西。
/**
* 根据二维码记录信息生成二维码
* @param id
* @return
*/
@Override
public String getQrcodeCode(Long id) {
if (id == null || "".equals(id)){
return null;
}
// 根据ID查询数据库表记录
Optional<OaOctQrcodeEntity> daoById = dao.findById(id);
// 如果有则生成二维码
if (daoById.isPresent()){
OaOctQrcodeEntity byId = daoById.get();
if (byId.getQrcodeUrl()==null || "".equals(byId.getQrcodeUrl()) || byId.getQrcodeCode()==null || "".equals(byId.getQrcodeCode())){
return null;
}
// 将url与code组装的方法
return packCode(byId.getQrcodeUrl(), byId.getQrcodeCode());
}
return null;
}
// 组装返回连接
private String packCode(String url,String code){
return new StringBuffer().append(url).append("?code=").append(code).toString();
}
校验二维码
- 用户扫码触发校验方法 有效校验成功则移动端正常显示求职登记表的页面,校验失败则失败
- 触发后端校验二维码方法,获取到前端传来的code参数,解密code,得到二维码数据库表的编码,查库得到生成二维码的记录信息
- 记录信息获取到过期时间与当前时间,比较,如果过期时间大于当前时间,则有效,小于则已过期
实际开发:根据前端传来的code 查询数据表得到过期时间等数据 不需要解密单纯比较即可
/**
* 根据二维码编码校验有效性
* @param code
* @return
*/
@Override
public Boolean checkQrcode(String code) {
if (StringUtils.isBlank(code)) {
logger.info("求职登记二维码参数为空");
throw new OaOctQrcodeException(OaOctQrcodeErrorEnum.PARAM_NOT_NULL);
}
// 验证二维码是否有效
if (!isTimeOur(code)) {
logger.info("求职登记二维码已过期");
throw new OaOctQrcodeException(OaOctQrcodeErrorEnum.OCT_QR_CODE);
}
return Boolean.TRUE;
}
// 判断code是否过期
private boolean isTimeOur(String code){
boolean isOut = false;
OaOctQrcodeEntity qrcodeEntity = findByQrcodeCode(code);
if (qrcodeEntity!=null&&!"".equals(qrcodeEntity)&&qrcodeEntity.getExpiresTime()!=null&&!"".equals(qrcodeEntity.getExpiresTime())){
long old_time = qrcodeEntity.getExpiresTime();
long now_time = System.currentTimeMillis();
// // 设置是否提前过期 0未过期 1 已过期
if (now_time < old_time&&qrcodeEntity.getIsOut().equals("0")) {
isOut = true;
}
}
return isOut;
}