以前,单个APP控制登录session就足够了,然后可以在cas中对多客户端进行统一身份验证。 以前也成功配置了cas5.3.9,实现了多客户端单点登录,但很麻烦。 最大的缺点是,cas另有统一认证服务,占用端口,占用内存。 也可以根据同样的原理使用redis等缓存数据库进行共享
JWT是用java编写的,可以生成唯一的token字符串。
通常由令牌类型(JWT )组成,包括Header、Claim、ExpiresAt、sign和Header。 常见的散列算法,如HMAC SHA256和RSA。
例如:
{
' alg': 'HS256 ',
' typ': 'JWT '
}
Header部分中的JSON使用Base64Url编码,形成JWT的第一部分。
Clainm是要加密的StringId,ExpiresAt可以设置过期日期,sign可以自己加密私钥。
JWT.create (
. withheader(header ) )。
. withclaim(userId ),userid ) )。
. withexpiresat (日期)
. sign(algorithm );
通过创建加密的token字符串并将该字符串分发给其他客户端,可以识别是否是同一用户,以及是哪个用户,从而实现单点登录非常简单。
maven下载jar包。 到最新版本发布为止是3.10.2。
com.auth0
java-jwt
3.10.2
创建JWTUtil工厂工具类
package com.zhaohy.app.utils;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import Java.util.concurrent.executors;
import Java.util.concurrent.scheduledexecutorservice;
import Java.util.concurrent.time unit;
import com.auth0.jwt.JWT;
import com.auth0. jwt.algorithms.algorithm;
import com.auth0. jwt.interfaces.decoded jwt;
import com.auth0. jwt.interfaces.jwt verifier;
公共类jwt util {//过期日期
privatestaticfinallongexpire _ time=15 * 60 * 1000; //默认15分钟
//私钥
私有密钥';
//*
生成签名,15分钟内过期
* @param **username**
* @param **password**
* @return
*/
publicstaticstringcreatetoken (字符串用户id ) {
try {
//设定有效期限
datedate=new date (system.current time millis ) ) EXPIRE_TIME );
//私钥和加密算法
algorithm algorithm=algorithm.hmac 256 (token _ secret );
//设置头部信息
mapheader=newhashmap(2;
header.put('type ',' Jwt ' );
header.put('alg )、' HS256 );
返回token字符串
return JWT.create (
. withheader(header ) )。
. withclaim(userId ),userid ) )。
. withexpiresat (日期)
. sign(algorithm );
}catch(exceptione ) {
e .打印堆栈跟踪(;
返回空值;
}
}
//*
生成token并自定义过期毫秒
* @param **username**
* @param **password**
* @return
*/
publicstaticstringcreatetoken (字符串用户id,long expireDate ) {
try {
//设定有效期限
datedate=new date (system.current time millis ) ) expireDate;
//私钥和加密算法
algorithm algorithm=algorithm.hmac 256 (token _ secret );
//设置头部信息
mapheader=newhashmap(2;
header.put('type ',' Jwt ' );
header.put('alg )、' HS256 );
返回token字符串
return JWT.create (
. withheader(header ) )。
. withclaim(userId ),userid ) )。
. withexpiresat (日期)
. sign(algorithm );
}catch(exceptione ) {
e .打印堆栈跟踪(;
返回空值;
}
}
//*
确保token是正确的
* @param **token**
* @return
*/
publicstaticstringverifytoken (字符串令牌) {
try {
algorithm algorithm=algorithm.hmac 256 (token _ secret );
jtverifierverifier=jwt.require (algorithm ).build );
ecodedjwtjwt=verifier.verify (token );
string userid=jwt.getclaim (' userid ' ).asString );
返回用户id;
}catch(exceptione ) {
返回空值;
}
}
publicstaticvoidmain (字符串[ ] args ) {
string token=jwt util.create token (' zhaohy ',3000 );
system.out.println (' token==' token );
string userid=jwt util.verify token (token );
system.out.println (userid==' userid );
//新的定时任务
Runnable runnable=new Runnable (
//run方法中定时执行的操作
公共void run (}
system.out.println (新日期);
string userid=jwt util.verify token (token );
system.out.println (userid==' userid );
}
(;
scheduledexecutorserviceservice=executors.newsinglethreadscheduledexecutor (;
/*
*参数:命令:运行线程
*参数:初始化延迟:初始化延迟
*参数3:period:2 :两次开始执行的最小间隔时间
*参数四:unit :计时单位
*/
服务. scheduleatfixedrate (runnable,0,4,TimeUnit.SECONDS );
}
}
执行中的main方法:
jwt-main方法输出结果的屏幕捕获
控制台在屏幕快照中打印的效果显示,token已创建、分析,过期后消失,过期有效。 现在,可以在项目中愉快地使用了。