目录
登录总体流程
前后端分离登录和常规后台登录的区别
1.前后端交互方式不同
常规登录: 通过页面的跳转和模型数据绑定
前后端分离: 通过Ajax和JSON进行通信
2.登录状态跟踪方式不同
常规登录: 通过Session和Cookie保存用户状态
前后端分离: 通过Token保持用户状态
前后端分离的优点
1.彻底解放前端
前端不再需要向后台提供模板或是后台在前端html中嵌入后台代码
2.提高工作效率,分工更加明确
前后端分离的工作流程可以让前端管签单,后端管后端,前后端开发同时进行,增加了开发的灵活性。
3.局部性能提升
通过前端路由的配置,可以实现页面的按需加载,不用一开始就加载所有的资源,提升了用户体验。
4.降低维护成本
通过MVC框架,可以快速的定位问题所在,客户端的问题不再需要后台人员参与及调试,增强了代码的重构及可维护性。
总体流程
基于JWT和RSA的Token机制
JWT简介
JWT(JSON Web Tokens )是JSON格式的加密字符串,用于加密验证信息,在前后端进行通信
分为三个部分
1) 头部
2) 负载
3) 指纹
需要的依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.9</version>
</dependency>
JWT工具类
/**
* JWT工具类
*/
public class JwtUtil {
public static final String JWT_KEY_USERNAME = "username";
public static final int EXPIRE_MINUTES = 120;
/**
* 私钥加密token
*/
public static String generateToken(String username, PrivateKey privateKey, int expireMinutes) {
return Jwts.builder()
.claim(JWT_KEY_USERNAME, username)
.setExpiration(DateTime.now().plusMinutes(expireMinutes).toDate())
.signWith(SignatureAlgorithm.RS256, privateKey)
.compact();
}
/**
* 从token解析用户
*
* @param token
* @param publicKey
* @return
* @throws Exception
*/
public static String getUsernameFromToken(String token, PublicKey publicKey){
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token);
Claims body = claimsJws.getBody();
String username = (String) body.get(JWT_KEY_USERNAME);
return username;
}
}
RSA简介
RSA是一种非对称式的加密算法
对称式加密只有一个秘钥,加密和解密都通过该秘钥完成
非对称式加密有两个秘钥,公钥和私钥,加密和解密由公钥和私钥分开完成
/**
* RSA工具类
*/
public class RsaUtil {
public static final String RSA_SECRET = "blbweb@#$%"; //秘钥
public static final String RSA_PATH = System.getProperty("user.dir")+"/rsa/";//秘钥保存位置
public static final String RSA_PUB_KEY_PATH = RSA_PATH + "pubKey.rsa";//公钥路径
public static final String RSA_PRI_KEY_PATH = RSA_PATH + "priKey.rsa";//私钥路径
public static PublicKey publicKey; //公钥
public static PrivateKey privateKey; //私钥
/**
* 类加载后,生成