1. 程式人生 > 實用技巧 >yb課堂之實戰登陸模組開發整合Json Web Token《十》

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配置檔案路徑

演示