jwt_生成token

jwt
1, 添加 依赖, 到 service; 因为这跟 业务相关
2, 生成token

添加依赖

在这里插入图片描述

修改UserServiceImpl.java

package com.qfedu.fmmall.service.impl;

import com.qfedu.fmmall.dao.UsersMapper;
import com.qfedu.fmmall.dao.UsersMapper;
import com.qfedu.fmmall.entity.Users;
import com.qfedu.fmmall.entity.Users;
import com.qfedu.fmmall.utils.Base64Utils;
import com.qfedu.fmmall.utils.MD5Utils;
import com.qfedu.fmmall.vo.ResStatus;
import com.qfedu.fmmall.vo.ResultVO;
import com.qfedu.fmmall.service.UserService;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * @author beyondx
 * @date Created in 2022/08/10/ 12:04
 */
// 实现类, 纳入spring管理
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UsersMapper usersMapper;

    /**
     * 注册业务
     *
     * @param name
     * @param pwd
     * @return
     */
    @Transactional
    @Override
    public ResultVO userRegist(String name, String pwd) {
        synchronized (this) {
            // 密码加密存储
            // 账号(用户名) 没有被占用
            // 严格意义上讲, 这里要加 jvm锁
            // 1.根据用户名查询, 这个用户 是否 已经被注册
            Example example = new Example(Users.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("username", name);
            List<Users> users = usersMapper.selectByExample(example);

            // 2.如果没有被注册, 则进行保存操作
            if (users.size() == 0) {
                // 密码加密
                String md5Pwd = MD5Utils.md5(pwd);
                Users user = new Users();
                user.setUsername(name);
                user.setPassword(md5Pwd);
                user.setUserImg("img/default.png");
                user.setUserRegtime(new Date());
                user.setUserModtime(new Date());
                int i = usersMapper.insertUseGeneratedKeys(user);
                if (i > 0) {
                    return new ResultVO(ResStatus.OK, "注册成功!", user);
                } else {
                    return new ResultVO(ResStatus.NO, "注册失败", null);
                }
            } else {
                return new ResultVO(ResStatus.OK, "用户名已经被注册!", null);
            }
        }
    }

    /**
     * 登录业务, 不涉及 事务操作; 只是查询
     *
     * @param name
     * @param pwd
     * @return
     */
    @Override
    public ResultVO checkLogin(String name, String pwd) {
        Example example = new Example(Users.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("username", name);
        List<Users> users = usersMapper.selectByExample(example);

        if (users.size() == 0) {
            return new ResultVO(ResStatus.NO, "登录失败, 用户名不存在!", null);
        } else {
            String md5Pwd = MD5Utils.md5(pwd);
            if (md5Pwd.equals(users.get(0).getPassword())) {
//                // 如果登录验证成功, 则需要生成令牌token; 需要给 前端传一个 token(按照特定规则生成的额字符串)
//                String token = Base64Utils.encode(name + "QIANfeng6666");
                // 基于Base64的不安全性, 下面使用 jwt 生成 token; jwt不仅指定了规则, 还对规则进行了实现
                // 使用 jwt规则, 生成 token字符串
                JwtBuilder builder = Jwts.builder();

                HashMap<String, Object> map = new HashMap<>();

                // 给 builder设置参数
                String token = builder.setSubject(name) // 主题, 就是 token中 携带的数据; 支持 链式调用
                        .setIssuedAt(new Date()) // 设置 token的生成时间, 目标是 做 过期校验
                        .setId(users.get(0).getUserId() + "") // 设置用户id 为 token的 id
                        .setClaims(map)
                        .setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 1000)) // 设置token的过期时间
                        .signWith(SignatureAlgorithm.HS256, "QIANfeng6666")// 设置加密方式 和 加密密码
                        .compact();


                return new ResultVO(ResStatus.OK, token, users.get(0));
            } else {
                return new ResultVO(ResStatus.NO, "登录失败, 密码错误!", null);
            }
        }
    }
}

修改前端代码 login.html

在这里插入图片描述

测试

在这里插入图片描述

posted on 2022-08-13 22:00  beyondx  阅读(247)  评论(0编辑  收藏  举报

导航