SpringBoot整合JWT
JWT
1、是什么
JSON Web Token (JWT)
2、JWT组成
(1)头信息:JWT头部分是一个描述JWT元数据的JSON对象
(2)主体部分:用户相关信息
(3)签名哈希:做数据验证
创建SpringBoot工程
引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
引入工具类
public final class MD5 {
public static String encrypt(String strSrc) {
try {
char hexChars[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f' };
byte[] bytes = strSrc.getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(bytes);
bytes = md.digest();
int j = bytes.length;
char[] chars = new char[j * 2];
int k = 0;
for (int i = 0; i < bytes.length; i++) {
byte b = bytes[i];
chars[k++] = hexChars[b >>> 4 & 0xf];
chars[k++] = hexChars[b & 0xf];
}
return new String(chars);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException("MD5加密出错!!+" + e);
}
}
public static void main(String[] args) {
System.out.println(MD5.encrypt("111111"));
}
}
public class JwtUtils {
public static final long EXPIRE = 1000 * 60 * 60 * 24;
public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
public static String getJwtToken(String id, String nickname){
String JwtToken = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
.setSubject("guli-user")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.claim("id", id)
.claim("nickname", nickname)
.signWith(SignatureAlgorithm.HS256, APP_SECRET)
.compact();
return JwtToken;
}
/**
* 判断token是否存在与有效
* @param jwtToken
* @return
*/
public static boolean checkToken(String jwtToken) {
if(StringUtils.isEmpty(jwtToken)) return false;
try {
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 判断token是否存在与有效
* @param request
* @return
*/
public static boolean checkToken(HttpServletRequest request) {
try {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return false;
Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 根据token获取会员id
* @param request
* @return
*/
public static String getMemberIdByJwtToken(HttpServletRequest request) {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return "";
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
Claims claims = claimsJws.getBody();
return (String)claims.get("id");
}
}
应用场景
1.用户登录,做完查询数据库验证正确的时候,通过一些规则把用户的信息进行加密成Token字符串,返回给客户端
2.然后客户端把这个Token存入浏览器Cookie或其他地方中,每次访问服务的时候就带着这个Tonken去访问
3.服务端就在后台根据这个Token,进行解析,解析出用户信息,验证用户是否存在做出相应的操作,比如拦截
代码案例:
用户登录controller层
@ApiOperation(value = "用户登录")
@PostMapping("login")
public R login(@RequestBody LoginVo loginVo){
String token = memberService.login(loginVo);
return R.ok().data("token",token);
}
用户登录service层
@Override
public String login(LoginVo loginVo) {
//1 获取参数,验空
String mobile = loginVo.getMobile();
String password = loginVo.getPassword();
if(StringUtils.isEmpty(mobile)||StringUtils.isEmpty(password)){
throw new GuliException(20001,"手机号或密码有误");
}
//2 根据手机号获取用户信息
QueryWrapper<UcenterMember> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mobile",mobile);
UcenterMember ucenterMember = baseMapper.selectOne(queryWrapper);
if(ucenterMember==null){
throw new GuliException(20001,"手机号或密码有误");
}
//3 密码加密后验证密码
String md5Password = MD5.encrypt(password);
if(!md5Password.equals(ucenterMember.getPassword())){
throw new GuliException(20001,"手机号或密码有误");
}
//4调用工具按照一定的规程和用户信息生成token字符串
String token = JwtUtils.getJwtToken(ucenterMember.getId(),ucenterMember.getNickname());
return token;
}
用户登录成功后拿这Token做后台验证
@ApiOperation(value = "根据token字符串获取用户信息")
@GetMapping("getUcenterByToken")
public R getUcenterByToken(HttpServletRequest request){
//根据相应的规则,解析出用户的信息,验证是否存在
String memberId = JwtUtils.getMemberIdByJwtToken(request);
UcenterMember ucenterMember = memberService.getById(memberId);
if(ucenterMember!=null) {
return R.ok().data("ucenterMember", ucenterMember);
}else {
return R.error();
}
}