yb課堂之實戰登陸模組開發整合Json Web Token《十》
阿新 • • 發佈:2020-07-17
開發登陸模組功能,並整合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 classUserServiceImpl 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配置檔案路徑