```xml
<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、配置参考

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

```yml
#超时配置。单位秒（可不配，默认：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 进行自动传递时的常规使用方式：

```java
@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 定义
```

其它使用场景，举例：

```java
//如果是通过 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

更多接口，可以点进去看地下。例：（一般不直接使用）

```java
//生成密钥
String secret = JwtUtils.createKey();

//解析令牌（一般用不到）
Claims claims = JwtUtils.parseJwt(token);
```