yb课堂之实战登陆模块开发整合Json Web Token《十》

开发登陆模块功能,并整合Json Web Token

开发登陆功能

LoginRequest.java

UserMapper.xml 

UserMapper.java

UserService.java

UserServiceImpl.java

package net.ybclass.online_ybclass.service.impl;

import net.ybclass.online_ybclass.model.entity.User;
import net.ybclass.online_ybclass.mapper.UserMapper;
import net.ybclass.online_ybclass.service.UserService;
import net.ybclass.online_ybclass.utils.CommonUtils;
import net.ybclass.online_ybclass.utils.JWTUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
import java.util.Random;

@Service
public class UserServiceImpl implements UserService {
    @Autowired(required = false)
    private UserMapper userMapper;
    @Override
    public int save(Map<String, String> userInfo) {
        User user=parseToUser(userInfo);
        if (user!=null){
            return userMapper.save(user);
        }else {
            return -1;
        }
    }

    /**
     * 解析map中的User对象
     * @param userInfo
     * @return
     */
    private User parseToUser(Map<String, String> userInfo) {
        if (userInfo.containsKey("phone")&&userInfo.containsKey("pwd")&&userInfo.containsKey("name")){
            User user =new User();
            user.setName(userInfo.get("name"));
            user.setHeadImg(getRandomImg());
            user.setPhone(userInfo.get("phone"));
            user.setCreateTime(new Date());
            String pwd=userInfo.get("pwd");
            //MD5加密
            user.setPwd(CommonUtils.MD5(pwd));
            return user;
        }
        return null;
    }

    /**
     * 放在CDN上的随机头像
     */
    private static final String [] headImg = {
            "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/12.jpeg",
            "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/11.jpeg",
            "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/13.jpeg",
            "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/14.jpeg",
            "https://xd-video-pc-img.oss-cn-beijing.aliyuncs.com/xdclass_pro/default/head_img/15.jpeg"
    };

    /**
     * 获取随机头像
     * @return
     */
    private String getRandomImg(){
        int size=headImg.length;
        Random random=new Random();
        int index=random.nextInt(size);
        return  headImg[index];
    }
    @Override
    public User findByPhone(String phone) {
        return userMapper.findByPhone(phone);
    }

    @Override
    public String findByPhoneAndPwd(String phone, String pwd) {
        User user=userMapper.findByPhoneAndPwd(phone,CommonUtils.MD5(pwd));
        return user==null?null: JWTUtils.geneJsonWebToken(user);
    }
}

UserController.java

CommonUtils.java

JWTUtils.java

package net.ybclass.online_ybclass.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import net.ybclass.online_ybclass.model.entity.User;

import java.util.Date;

/**
 * JWT工具类
 * 注意点:
 * 1、生成的token,是可以通过base64进行解密出铭文信息
 * 2、base64进行解密出明文信息,修改再进行编码,则会解密失败
 * 3、无法作废已颁布的token,除非改密钥
 */
public class JWTUtils {
    /**
     * 过期时间,一周
     */
    static final long EXPIRE = 60000 * 60 * 24 * 7;
    /**
     * 加密密钥
     */
    private static final String SECRET = "ybclass.net168";
    /**
     * 令牌前缀
     */
    private static final String TOKEN_PREFIX = "ybclass";
    /**
     * 主题
     */
    private static final String SUBJECT = "ybclass";

    /**
     * 根据用户信息,生成令牌
     *
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user) {
        String token = Jwts.builder().setSubject(SUBJECT)
                .claim("head_img", user.getHeadImg())
                .claim("id", user.getId())
                .claim("name", user.getName())
                .setIssuedAt(new Date()) //令牌颁布时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) //过期时间
                .signWith(SignatureAlgorithm.HS256, SECRET) //加密方式
                .compact();
        token = TOKEN_PREFIX + token;
        return token;
    }

    /**
     * 校验token方法
     *
     * @param token
     * @return
     */
    public static Claims checkJWT(String token) {
        try {
            final Claims claims = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
                    .getBody();
            return claims;
        } catch (Exception e) {
            return null;
        }
    }
}

项目结构

修改domain为model层

  • 增加entity、request包
  • 记得改appliccation.properties配置文件路径

演示

原文地址:https://www.cnblogs.com/chenyanbin/p/13324566.html