solon-sessionstate-jwt
<dependency>
<groupId>org.noear</groupId>
<artifactId>solon-sessionstate-jwt</artifactId>
</dependency>
1、描述
基础扩展插件,为 Solon Web 提供分布式会话状态支持。例如:管理后台要做集群,此时会话需要共享(插件:solon-sessionstate-jedis,也适合这种场景)。
这个插件比较特殊,它的载体像是 “微型的个人移动数据库”。由后端自动生成,然后通过 Cookie、Header、Form、QueryString 或者接口的输入输出等,在前后端之间来回传递。
- 一般管理后台可用 Cookie 传入和输出;
- 接口开发时可用 Header 传入,可用 Header 或接口返回输出。
建议存放的数据要“尽量少”,毕竟要来回传的,费流量。(比如,以前要存个 user,现在可以只存 user_id)
2、配置参考
默认可以不加任何配置。但密钥建议配置个新的
#超时配置。单位秒(可不配,默认:7200)
server.session.timeout: 7200
#可共享域配置(可不配,默认当前服务域名;多系统共享时要配置)
server.session.cookieDomain: "solon.noear.org"
#Jwt 令牌变量名;(可不配,默认:TOKEN)
server.session.state.jwt.name: "TOKEN"
#Jwt 密钥(使用 JwtUtils.createKey() 生成);(可不配,默认:xxx)
server.session.state.jwt.secret: "E3F9N2kRDQf55pnJPnFoo5+ylKmZQ7AXmWeOVPKbEd8="
#Jwt 令牌前缀(可不配,默认:空)
server.session.state.jwt.prefix: "Bearer"
#Jwt 允许超时;(可不配,默认:true);false,则token一直有效
server.session.state.jwt.allowExpire: true
#Jwt 允许自动输出;(可不配,默认:true);flase,则不向header 或 cookie 设置值(由用户手动控制)
server.session.state.jwt.allowAutoIssue: true
#Jwt 允许使用Header传递;(可不配,默认:使用 Cookie 传递);true,则使用 header 传递
server.session.state.jwt.allowUseHeader: false
3、代码应用
一般通过 Header、Cookie 进行自动传递时的常规使用方式:
@Controller
public class DemoController{
@Mapping("/test")
public void test(Context ctx){
//获取会话
long user_id = ctx.sessionAsLong("user_id", 0L);
//设置会话状态
ctx.sessionSet("user_id", 1001L);
}
}
//更多接口,可参考 SessionState 定义
其它使用场景,举例:
//如果是通过 QueryString 或 Form 传递 TOKEN的,可以写个过滤把它转到 Header 上
@Component
public class DemoFilter implements Filter{
@Override
public void doFilter(Context ctx, FilterChain chain) throws Throwable {
String token = ctx.param("TOKEN");
if(Utils.isNotEmpty(token)){
ctx.headerMap().put("TOKEN", token);
}
}
}
//如果需要通过接口返回输出
@Controller
public class LoginController{
@Mapping("/login")
public Result login(Context ctx){
//设置会话状态
ctx.sessionSet("user_id", 1001L);
//sessionToken() 接口,目前仅在 solon.sessionstate.jwt 插件中支持
return Result.succeed(ctx.sessionState().sessionToken());
}
}
4、辅助工具 JwtUtils
更多接口,可以点进去看地下。例:(一般不直接使用)
//生成密钥
String secret = JwtUtils.createKey();
//解析令牌(一般用不到)
Claims claims = JwtUtils.parseJwt(token);