基于Spring+SpringMVC+MyBatis开发书评网用户注册与登录功能实现 + MD5处理用户密码 + 业务逻辑异常类

Posted 被雨遗忘的夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Spring+SpringMVC+MyBatis开发书评网用户注册与登录功能实现 + MD5处理用户密码 + 业务逻辑异常类相关的知识,希望对你有一定的参考价值。

目录

概要

一、 注册

1.1 Controller层的用户注册逻辑

1.2 业务逻辑异常

1.3 Service层的逻辑处理

1.4 MD5摘要处理用户密码

二、 登录

2.1 Controller层的用户登录逻辑

2.2 Service层的逻辑处理


概要

讲述用户注册与登录功能实现 + MD5处理用户密码 + 业务逻辑异常类的实现

一、 注册

1.1 Controller层的用户注册逻辑

@PostMapping("/registe")
    @ResponseBody
    public Map registe(String vc, String username, String password, String nickname, HttpServletRequest request) {
        // 1、 验证码校验
        // 获取前端用户输入的验证码字符
        String verifyCode = (String) request.getSession().getAttribute("kaptchaVerifyCode");
        // 验证码对比
        Map result = new HashMap();
        // vc.equalsIgnoreCase() 忽略大小写
        if (vc == null || verifyCode == null || !vc.equalsIgnoreCase(verifyCode)) {
            result.put("code", "VC01");
            result.put("msg", "验证码错误");
        } else {
            // 2、 验证码校验成功后,跳转到Service层处理
            try {
                memberService.createMember(username, password, nickname);
                result.put("code", "0");
                result.put("msg", "success");
            } catch (BussinessException ex) {
                // 打印堆栈
                ex.printStackTrace();
                result.put("code", ex.getCode());
                result.put("msg", ex.getMsg());
            }
        }
        return result;
    }

1.2 业务逻辑异常

package com.imooc.reader.service.exception;

/**
 * @className: BussinessException
 * @author: 李绍宇
 * @description: 业务逻辑异常
 * @date: 2021/7/24 10:46
 * @version: 1.0
 */
public class BussinessException extends RuntimeException{
    private String code;
    private String msg;
    public BussinessException(String code , String msg){
        super(msg);
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

1.3 Service层的逻辑处理

/**
     * 会员注册,创建新会员
     * @param username 用户名
     * @param password 密码
     * @param nickname 昵称
     * @return 新会员对象
     */
    public Member createMember(String username, String password, String nickname) {
        QueryWrapper<Member> queryWrapper = new QueryWrapper<Member>();
        queryWrapper.eq("username", username);
        List<Member> memberList = memberMapper.selectList(queryWrapper);
        // 1、 判断用户名是否已存在
        if(memberList.size() > 0){
            throw new BussinessException("M01","用户名已存在");
        }
        // 2、 不存在则保存新用户
        Member member = new Member();
        member.setUsername(username);
        member.setNickname(nickname);

        // 3、 密码处理
        // 产生盐值 (1000-1999)
        int salt = new Random().nextInt(1000) + 1000;
        // MD5摘要处理
        String md5 = MD5Utils.md5Digest(password, salt);
        // 保存加密后的密码、盐值和创建时间
        member.setPassword(md5);
        member.setSalt(salt);
        member.setCreateTime(new Date());
        memberMapper.insert(member);
        return member;
    }

1.4 MD5摘要处理用户密码

public class MD5Utils {
    public static String md5Digest(String source , Integer salt){
        char[] ca = source.toCharArray();
        // 混淆源数据
        for(int i = 0 ; i < ca.length ; i++){
            ca[i] = (char) (ca[i] + salt);
        }
        String target = new String(ca);
        String md5 = DigestUtils.md5Hex(target);
        return md5;
    }
}

二、 登录

2.1 Controller层的用户登录逻辑

@PostMapping("/check_login")
    @ResponseBody
    // 原生对象:HttpSession session
    public Map checkLogin(String username, String password, String vc , HttpSession session){
        // 1、 验证码校验
        String verifyCode = (String)session.getAttribute("kaptchaVerifyCode");
        // 验证码对比
        Map result = new HashMap();
        if(vc == null || verifyCode == null || !vc.equalsIgnoreCase(verifyCode)){
            result.put("code", "VC01");
            result.put("msg", "验证码错误");
        }else{
            try {
                // 2、 登录校验
                Member member = memberService.checkLogin(username, password);
                // 登录校验成功后,保存用户数据到Session,用于成功后首页右上角展示
                session.setAttribute("loginMember" , member);
                result.put("code", "0");
                result.put("msg", "success");
            }catch (BussinessException ex){
                ex.printStackTrace();
                result.put("code", ex.getCode());
                result.put("msg", ex.getMsg());
            }
        }
        return result;
    }

2.2 Service层的逻辑处理

/**
     * 登录检查
     *
     * @param username 用户名
     * @param password 密码
     * @return 登录对象
     */
    public Member checkLogin(String username, String password) {
        QueryWrapper<Member> queryWrapper = new QueryWrapper<Member>();
        queryWrapper.eq("username", username);

        // 1、 用户名校验
        // selectOne()查询用户名,全局唯一
        Member member = memberMapper.selectOne(queryWrapper);
        if(member == null){
            throw new BussinessException("M02", "用户不存在");
        }

        // 2、 密码校验
        String md5 = MD5Utils.md5Digest(password, member.getSalt());
        if(!md5.equals(member.getPassword())){
            throw new BussinessException("M03", "输入密码有误");
        }
        return member;
    }

以上是关于基于Spring+SpringMVC+MyBatis开发书评网用户注册与登录功能实现 + MD5处理用户密码 + 业务逻辑异常类的主要内容,如果未能解决你的问题,请参考以下文章

spring与mybati整合方法

自己开发的音乐视频网站

Spring Boot整合Mybati之逆向工程

抽奖活动啦!5本SpringMVC+MyBatis相关3本Android Studio相关6本Kafka相关

spring+mybati java config配置引起的bean相互引用日志报警告问题

Spring基于注解及SpringMVC