SpringBoot拦截器和自定义注解验证是否登录
demo地址:https://github.com/luomouren/sbDemo
参考网址:https://www.jianshu.com/p/97362fdf039e (非常感谢作者~)
用SpringBoot开发后台用于移动端API接口,移动端登录一次后,返回accessToken字符串,移动端后面的交互只要传入accessToken即可验证其有效性,将accessToken转换成CurrentUser,在controller内可以直接使用操作其bean。需要做以下几点:
- 1.Token生成帮助类
- 2.拦截器验证是否是有效的accessToken
- 3.添加自定义注解LoginRequired(请求方法是否需要验证accessToken)
- 4.添加自定义注解CurrentUser(将accessToken转换成CurrentUser)
- 5.SpringBoot配置拦截器
- 6.测试
1.Token生成帮助类
package com.xxx.demo.frame.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;
/**
* token生成
* @author luomouren
*/
public class TokenUtils {
private Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 签名秘钥
*/
public static final String SECRET = "guangYuan";
/**
* 生成token
* @param id 一般传入userName
* @return
*/
public static String createJwtToken(String id){
String issuer = "www.guangyuanbj.com";
String subject = "luomouren@xxx.com";
long ttlMillis = System.currentTimeMillis();
return createJwtToken(id, issuer, subject, ttlMillis);
}
/**
* 生成Token
*
* @param id
* 编号
* @param issuer
* 该JWT的签发者,是否使用是可选的
* @param subject
* 该JWT所面向的用户,是否使用是可选的;
* @param ttlMillis
* 签发时间
* @return token String
*/
public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {
// 签名算法 ,将对token进行签名
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 生成签发时间
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
// 通过秘钥签名JWT
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
// Let's set the JWT Claims
JwtBuilder builder = Jwts.builder().setId(id)
.setIssuedAt(now)
.setSubject(subject)
.setIssuer(issuer)
.signWith(signatureAlgorithm, signingKey);