Solon

solon.sessionstate.jwt

v2.7.3 native </> markdown
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon.sessionstate.jwt</artifactId>
</dependency>

1、描述

基础扩展插件,为 Solon Web 提供分布式会话状态支持。例如:管理后台要做集群,此时会话需要共享(插件:solon.sessionstate.jedis,也适合这种场景)。

这个插件比较特殊,它的载体像是微型的个人移动数据库。可以通过 Cookie、Header、Form、QueryString 或者接口的输入输出等,在服务端与客户端之间来回不断的来回传递。很适合做单点登录(SSO)

一般管理后台可用 Cookie 传入和输出;接口开发时可用 Header 传入,可用 Header 或接口返回输出。

建议存放的数据尽量少,毕竟要来回传的,费流量。(比如,以前要存个 user,现在可以只存 user_id)

2、配置参考

默认可以不加任何配置。但密钥建议配置个新的

#超时配置。单位秒(可不配,默认:7200)
server.session.timeout: 7200 
#可共享域配置(可不配,默认当前服务域名;多系统共享时要配置)
server.session.state.domain: "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);