热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

认证服务:注册和登录

注册认证服务控制层面PostMapping(regist)publicStringregist(ValidUserRegisteVovo,BindingResultresul

注册


认证服务控制层面 

@PostMapping("/regist")
public String regist(@Valid UserRegisteVo vo, BindingResult result, RedirectAttributes redirectAttributes){
if (result.hasErrors()){
Map errors&#61;new HashMap<>();
result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
//重定向中保存数据
redirectAttributes.addFlashAttribute("errors",errors);
//校验出错&#xff0c;转到注册页
//Request method &#39;POST&#39; not supported
//用户注册->/regist[post]--->转发/reg.html(路径映射默认都是get方式进行访问的.)
return "redirect:http://auth.gulimall.com/reg.html";
}
//真正的注册
//1.校验验证码
String code &#61; vo.getCode();
String s &#61; redisTemplate.opsForValue().get(AuthServerConstant.SMS_CODE_CACHE_PREFIX &#43; vo.getPhone());
if(!StringUtils.isEmpty(s)){
if(code.equals(s)){
if(code.equals( s.split("_")[0])){
//删除验证码
redisTemplate.delete(AuthServerConstant.SMS_CODE_CACHE_PREFIX&#43;vo.getPhone());
//验证码通过
R r &#61; memberFeignService.register(vo);
if(r.getCode()&#61;&#61;0){
//成功
return "redirect:http://auth.gulimall.com/login.html";
}else {
HashMap errors &#61; new HashMap<>();
errors.put("msg",r.getData("msg",new TypeReference(){}));
redirectAttributes.addFlashAttribute("errors",errors);
return "redirect:http://auth.gulimall.com/reg.html";
}
}else {
HashMap errors &#61; new HashMap<>();
errors.put("code","验证码错误");
redirectAttributes.addFlashAttribute("errord",errors);
return "redirect:http://auth.gulimall.com/reg.html";
}
}
}else{
HashMap errors &#61; new HashMap<>();
errors.put("code","验证码错误");
redirectAttributes.addFlashAttribute("errord",errors);
return "redirect:http://auth.gulimall.com/reg.html";
}
//注册成功返回到登录页
return "redirect:https://auth.gulimall.com/login.html";
}

运程服务调用 


&#64;PostMapping("member/member/registe")
R register(&#64;RequestBody UserRegisteVo vo);

&#64;Override
public void regist(MemberRegisterVo vo) {
MemberEntity entity &#61; new MemberEntity();
MemberDao memberDao &#61; this.baseMapper;
MemberLevelEntity levelEntity &#61;memberLevelDao.getDefaultLevel();
//设置默认登记
entity.setLevelId(levelEntity.getId());
//检查用户名和手机号是否唯一
checkPhoneUnique(vo.getPhone());
checkUsernameUnique(vo.getUserName());
entity.setMobile(vo.getPhone());
entity.setUsername(vo.getUserName());
//密码加密处理
BCryptPasswordEncoder passwordEncoder &#61; new BCryptPasswordEncoder();
String encode &#61; passwordEncoder.encode(vo.getPassword());
entity.setPassword(encode);
memberDao.insert(entity);
}
&#64;Override
public void checkPhoneUnique(String phone)throws PhoneExistException {
MemberDao memberDao &#61; this.baseMapper;
Integer count &#61; memberDao.selectCount(new QueryWrapper().eq("mobile", phone));
if(count>0){
throw new PhoneExistException();
}
}
&#64;Override
public void checkUsernameUnique(String username)throws UsernameExistException {
MemberDao memberDao &#61; this.baseMapper;
Integer count &#61; memberDao.selectCount(new QueryWrapper().eq("username", username));
if(count>0){
throw new UsernameExistException();
}
}

异常处理


public class UsernameExistException extends RuntimeException{
public UsernameExistException() {
super("用户名已存在");
}
}


public class PhoneExistException extends RuntimeException{
public PhoneExistException() {
super("电话已存在");
}
}


&#64;Override
public void checkPhoneUnique(String phone)throws PhoneExistException {
MemberDao memberDao &#61; this.baseMapper;
Integer count &#61; memberDao.selectCount(new QueryWrapper().eq("mobile", phone));
if(count>0){
throw new PhoneExistException();
}
}
&#64;Override
public void checkUsernameUnique(String username)throws UsernameExistException {
MemberDao memberDao &#61; this.baseMapper;
Integer count &#61; memberDao.selectCount(new QueryWrapper().eq("username", username));
if(count>0){
throw new UsernameExistException();
}
}

登录 


 认证服务控制层面 

&#64;PostMapping("/login")
public String login(&#64;RequestBody UserLoginVo vo,RedirectAttributes redirectAttributes){
//运程登录
R login &#61; memberFeignService.login(vo);
if(login.getCode()&#61;&#61;0){
//成功
return "redirect:https://gulimall.com";
}else {
//失败
HashMap errors&#61;new HashMap<>();
errors.put("msg",login.getData("msg",new TypeReference(){}));
redirectAttributes.addFlashAttribute("errors",errors);
return "redirect:https://auth.gulimall.com/login.html";
}
}

运程调用服务 


&#64;PostMapping("member/member/login")
R login(&#64;RequestBody UserLoginVo vo);

&#64;Override
public MemberEntity login(MemberLoginVo vo) {
String loginacct &#61; vo.getLoginacct();
String password &#61; vo.getPassword();
//1.去数据库查询
MemberDao baseMapper &#61; this.baseMapper;
MemberEntity entity &#61; baseMapper.selectOne(new QueryWrapper().eq("username", loginacct).
or().eq("mobile", loginacct));
if(entity&#61;&#61;null){
//登录失败
return null;
}else{
//1.获取数据库中密码
String passwordDb &#61; entity.getPassword();
BCryptPasswordEncoder encoder &#61; new BCryptPasswordEncoder();
//2.判断是否匹配
boolean matches &#61; encoder.matches(password, passwordDb);
if(matches){
return entity;
}else{
return null;
}
}
}

错误枚举类新增


USER_EXIST_EXCEPTION(15001,"用户存在异常"),
PHONE_EXIST_EXCEPTION(15002,"手机号存在异常"),
LOGINACCT_PASSWORD_INVAILD_EXCEPTION(15003,"账号或密码错误")


vo对象 


UserLoginVo


&#64;Data
public class UserLoginVo {
private String loginacct;
private String password;
}


UserRegisteVo


&#64;Data
public class UserRegisteVo {
&#64;NotEmpty(message &#61; "用户名必须提交")
&#64;Length(min &#61; 6,max &#61; 18,message &#61; "用户名必须是6-18位字符")
private String userName;
&#64;NotEmpty(message &#61; "密码必须填写")
&#64;Length(min &#61; 6,max &#61; 18,message &#61; "密码必须是6-18位字符")
private String password;
&#64;NotEmpty(message &#61; "手机号必须填写")
&#64;Pattern(regexp &#61; "^[1]([3-9]{9}$)",message &#61; "手机号格式不正确")
private String phone;
&#64;NotEmpty(message &#61; "验证码必须填写")
private String code;
}





推荐阅读
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 深入探索HTTP协议的学习与实践
    在初次访问某个网站时,由于本地没有缓存,服务器会返回一个200状态码的响应,并在响应头中设置Etag和Last-Modified等缓存控制字段。这些字段用于后续请求时验证资源是否已更新,从而提高页面加载速度和减少带宽消耗。本文将深入探讨HTTP缓存机制及其在实际应用中的优化策略,帮助读者更好地理解和运用HTTP协议。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • Nginx 反向代理配置与应用指南
    本文详细介绍了 Nginx 反向代理的配置与应用方法。首先,用户可以从官方下载页面(http://nginx.org/en/download.html)获取最新稳定版 Nginx,推荐使用 1.14.2 版本。下载并解压后,通过双击 `nginx.exe` 文件启动 Nginx 服务。文章进一步探讨了反向代理的基本原理及其在实际应用场景中的配置技巧,包括负载均衡、缓存管理和安全设置等,为用户提供了一套全面的实践指南。 ... [详细]
author-avatar
LeoWang
帅气鄙人的PHP程序员
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有