Solon

F、会话状态接口及应用

</> markdown

关于会话状态,一般是用于保存用户的会话状态。已适配的插件有:

插件数据存储补充说明
solon.sessionstate.local保存在本地内存通过 Cookie 传递客户端标识
solon.sessionstate.jedis保存在 Redis 里(分布式)通过 Cookie 传递客户端标识
solon.sessionstate.redisson保存在 Redis 里(分布式)通过 Cookie 传递客户端标识
solon.sessionstate.jwt保存在 jwt 字符串中通过 Cookie、Header、接口等...进行来回传递 jwt
很适合做单点登录(SSO)

Solon 的会话状态是外部化的,即不需要Http容器支持(如果Http容器自带,也可以使用其自带的),同时也非常方便定制。其中 solon.sessionstate.jwt 是比较另类的定制方案,把 jwt 的使用改装成 SessionState 接口进行使用。插件的具体使用,请参考生态频道的具体插件使用说明。

1、接口使用示例

写入 session

@Controller
public class LoginController{
    @Mapping("login")
    public void login(Context ctx){
        ctx.sessionSet("logined", true);
        ctx.sessionSet("name", "world");
    }
}

读取 session 数据

@Controller
@Mapping("test")
public class UserController{
    @Mapping("case1")
    public String login(Context ctx){
        return ctx.session("name");
        //return ctx.session("name", "world"); //带默认值
    }
}

2、在模板里的使用

目前对模板引擎的适配,并未直接添加上下文或会话状态的变量。所以需要自己添加一下。。。一般不建议直接在模板里使用会话状态。

控制器

@Controller
@Mapping("test")
public class UserController{
    @Mapping("case1")
    public ModelAndView login(Context ctx){
        Map<String,Object> model = new HashMap<>();
        model.put("ctx", ctx);
        
        return ModelAndView("test/cace1.ftl", model);
    }
}

模板 test/cace1.ftl

<html>
<head>
    <title>test</title>
</head>
<body>
 你好 ${ctx.session("name")!}
</body>
</html>

3、会话状态相关的接口

会话相关接口说明
-sessionState()->SessionState获取 sessionState
-sessionId()->String获取 sessionId
-session(String)->Object获取 session 状态
-session(String, T)->T获取 session 状态(类型转换,存在风险)
-sessionAsInt(String)->int获取 session 状态以 int 型输出
-sessionAsInt(String, int)->int获取 session 状态以 int 型输出, 并给定默认值
-sessionAsLong(String)->long获取 session 状态以 long 型输出
-sessionAsLong(String, long)->long获取 session 状态以 long 型输出, 并给定默认值
-sessionAsDouble(String)->double获取 session 状态以 double 型输出
-sessionAsDouble(String, double)->double获取 session 状态以 double 型输出, 并给定默认值
-sessionSet(String, Object)设置 session 状态
-sessionRemove(String)移除 session 状态
-sessionClear()清空 session 状态

4、自定义会话状态(不推荐)

非要自定义的话,建议用高性能的存储来做。以 JedisSessionState 实现为例,代码可参考:仓库源码

a) 实现 SessionState 接口

public class JedisSessionState implements SessionState { //也可以扩展自:SessionStateBase
    //...
}

b) 实现 SessionStateFactory 接口

public class JedisSessionStateFactory implements SessionStateFactory {
    //...
}

c) 进行注册

public class App{
    public static void main(String[] args){
        Solon.start(App.class, args, app->{
            Bridge.sessionStateFactorySet(new JedisSessionStateFactory());
        });    
    }
}