JwtUtils工具类:
public class JwtUtils {
/*
过期时间为24小时,毫秒计时的---毫秒--》秒--》分--》小时--》天
*/
private static final long EXPIRE_TIME= 60 * 24 * 60 * 1000;
/**
* 密钥,注意这里如果真实用到,应当设置到复杂点,相当于私钥的存在。如果被人拿到,相当于它可以自己制造token了。
*/
private static final String TOKEN_SECRET="token-xly"; //密钥盐
/**
* 签名生成
* @param user
* @return
*/
public static String sign(UserInfo user){
String token = null;
try {
Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
token = JWT.create()
.withIssuer("xu")//自定义的
.withClaim("username", user.getPhone())
.withExpiresAt(expiresAt)
// 使用了HMAC256加密算法。
.sign(Algorithm.HMAC256(TOKEN_SECRET));
} catch (Exception e){
e.printStackTrace();
}
return token;
}
/**
* 签名验证
* @param token
* @return
*/
public static boolean verify(String token){
try {
JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("xu").build();//自定义的
DecodedJWT jwt = verifier.verify(token);
System.out.println("认证通过:");
System.out.println("issuer: " + jwt.getIssuer());
System.out.println("username: " + jwt.getClaim("username").asString());
System.out.println("过期时间:" + jwt.getExpiresAt());
return true;
} catch (Exception e){
return false;
}
}
}
UserInfoMapper.xml:(登录验证主要用到findInfo,findLogin)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.needs.mapper.UserInfoMapper">
<resultMap id="MessageTextResult" type="com.example.needs.entity.UserInfo" >
<result property="id" column="id" />
<result property="phone" column="phone" />
<result property="password" column="password" />
<result property="photo" column="photo"/>
<result property="name" column="name"/>
<result property="status" column="status"/>
<result property="email" column="email"/>
<result property="pwdKey" column="pwd_key"/>
<result property="createTime" column="create_time"/>
</resultMap>
<!--验证通过用户信息添加进表-->
<insert id="yzUc" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user_info (phone,`password`,photo,`name`,`status`,email,pwd_key,create_time) VALUES (#{phone},#{password},#{photo},#{name},#{status},#{email},#{pwdKey},#{createTime});
</insert>
<!--查询用户表全部信息-->
<select id="findInfo" resultMap="MessageTextResult">
select * from user_info where phone=#{phone};
</select>
<!--修改头像-->
<update id="updPhoto">
UPDATE user_info SET photo=#{photo} WHERE phone=#{phone};
</update>
<!--修改密码-->
<update id="updPasswd">
update user_info set password=#{password},pwd_key=#{pwdKey} where phone=#{phone};
</update>
<!--修改邮箱-->
<update id="updEmail">
update user_info set email=#{email} where phone=#{phone};
</update>
<!--根据emali查询信息-->
<select id="findByEmail" resultMap="MessageTextResult">
SELECT * FROM user_info WHERE email=#{email};
</select>
<!--登录查询-->
<select id="findLogin" resultType="boolean">
select * from user_info where phone=#{phone} and password=#{password};
</select>
</mapper>
UserInfoMapper:(登录验证主要用到findInfo,findLogin)
@Mapper
public interface UserInfoMapper {
/**
* 验证输入数据库
* @param userInfo phone,password,photo,name,status,email,pwd_key,create_time
* @return
*/
int yzUc(UserInfo userInfo);
/**
* 根据手机号查询用户表信息
* @param userInfo
* @return
*/
UserInfo findInfo(UserInfo userInfo);
/**
* 修改头像
* @param userInfo
* @return
*/
Integer updPhoto(UserInfo userInfo);
/**
* 修改密码
* @param userInfo
* @return
*/
Integer updPasswd(UserInfo userInfo);
/**
* 修改邮箱
* @param userInfo
* @return
*/
Integer updEmail(UserInfo userInfo);
/**
* 根据邮箱查询
* @param userInfo
* @return
*/
UserInfo findByEmail(UserInfo userInfo);
/**
* 登录查询
* @param userInfo
* @return
*/
Boolean findLogin(UserInfo userInfo);
}
UserInfoServiceImpl:
/**
* 根据手机号查询信息
*
* @param userInfo
* @return
*/
@Override
public UserInfo findInfo(UserInfo userInfo) {
return userInfoMapper.findInfo(userInfo);
}
/**
* JwtUtils,token登录认证
* @param userInfo
* @return
*/
@Override
public Map<String, Object> findLogin(UserInfo userInfo) {
Map<String, Object> map = new HashMap<>();
if (userInfo.getPassword()==null||userInfo.getPhone()==null) { //如果输入手机号或密码为空,抛出异常
throw new NullPointerException("用户名或密码为空");
}
UserInfo userInfo1 = userInfoMapper.findInfo(userInfo); //实例化userInfo1,根据userInfo中的手机号查询出来数据库中对应的pwdKey盐
String passwd = Md5Util.getHMAC(userInfo.getPassword(), userInfo1.getPwdKey()); //获取输入的密码,与该信息数据库总对应的盐组合,进行getHMAC加密
userInfo.setPassword(passwd); //将加密后的密码,替换掉输入的未加密的密码
if (userInfoMapper.findLogin(userInfo)) { //findLogin根据手机号和密码查询数据库中的信息,能查到为true,反之为false
String token = JwtUtils.sign(userInfo); //通过验证之后给他一个token,工具类中定义过的工具类方法,直接拿来调用。
if (token != null) { //验证token如果token不为空,继续执行
map.put("code:", 200);
map.put("message:", "认证成功");
map.put("token:", token);
System.out.println(map);
return map;
}
}
map.put("code:", 500);
map.put("message:", "认证失败");
return map;
}
UserInfoService:
/**
* 更加姓名查询用户信息(登录)
* @param userInfo
* @return
*/
UserInfo findInfo(UserInfo userInfo);
/**
* 登录查询
* @param userInfo
* @return
*/
Map<String,Object> findLogin(UserInfo userInfo);
UserInfoController:
/**
* 根据手机号查询信息
* @param userInfo phone;
* @return
*/
@RequestMapping("/findInfo")
public UserInfo findInfo(@RequestBody UserInfo userInfo){
return userInfoService.findInfo(userInfo);
}
/**
* 登录验证
* @param userInfo
* @return
*/
@RequestMapping("/findLogin")
public Map<String,Object> findLogin(@RequestBody UserInfo userInfo){
return userInfoService.findLogin(userInfo);
}