# final-session
**Repository Path**: iceman123/final-session
## Basic Information
- **Project Name**: final-session
- **Description**: final-session 一个轻量级分布式session框架,它可以无限水平扩展你的集群,使集群会话变得简单。
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2022-03-15
- **Last Updated**: 2022-05-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# final-session
**final-session** 一个轻量级分布式session框架,它可以无限水平扩展你的集群,使集群会话变得简单。
轻巧、易于配置、低入侵是 `final-session` 的设计理念,轻盈而美。

支持redis、数据库存储会话session,推荐使用redis存储方案。通过自定义生成不同集群ID,读写访问不同的redis集群,从而实现节点无限扩展,架构图如下:

demo展示

## 快速入门
### 方式一:
直接从gitee下载最新jar包:https://gitee.com/lingkang_top/final-session/releases
### 方式二:
拉取代码,使用maven打包
```shell
mvn clean package
```
得到项目核心包:`final-session-core/target/final-session-core-1.0.0.jar`
将`final-session-core-1.0.0.jar`引入项目
例如Maven中:
```xml
top.lingkang
final-session-core
1.0.0
system
${project.basedir}/lib/final-session-core-1.0.0.jar
```
## 配置
### 使用配置
继承`FinalSessionConfigurerAdapter`类进行配置。
在spring中配置:`(必须在所有拦截器的前面)`
```java
@Order(-19951219)
@Component
public class MyFinalSessionConfig extends FinalSessionConfigurerAdapter {
@Override
protected void configurer(FinalSessionProperties properties) {
// 对项目进行配置
}
}
```
在传统 Servlet 3.1+ 配置
```java
public class MyFinalSessionConfig extends FinalSessionConfigurerAdapter {
@Override
protected void configurer(FinalSessionProperties properties) {
// 对项目进行配置
}
}
```
然后在web.xml中配置:`(必须在所有拦截器的前面)`
```xml
sessionFilter
/*
sessionFilter
top.lingkang.exampleservlet.config.MyFinalSessionConfig
```
### 会话名称和会话ID
默认的cookie为fs,会话ID为UUID,可以定制
```java
@Override
protected void configurer(FinalSessionProperties properties) {
// 自定义会话时长
properties.setMaxValidTime(19951219L);
// 自定义cookie名称
properties.setCookieName("lingkang");
// 配置id生成规则
properties.setIdGenerate(new IdGenerate() {
@Override
public String generateId(HttpServletRequest request) {
// 自定义id的值,可以根据不同id前缀访问不同redis集群,从而实现集群无限扩展
return UUID.randomUUID().toString();
}
});
// 更多配置 ...
}
```
### 会话的存储
通过存储于db、nosql中,实现分布式会话存储。
#### 存储于redis中
添加依赖
```xmnl
org.springframework.boot
spring-boot-starter-data-redis
```
配置
```java
@Autowired
private RedisTemplate redisTemplate;
@Override
protected void configurer(FinalSessionProperties properties) {
// 默认会话存储于内存中,下面将会话存储于redis中,需要引入RedisTemplate依赖
properties.setRepository(new FinalRedisRepository(redisTemplate));
}
```
`若想在可视化工具看到key,可自行反序列化`
#### 存储于数据库
目前支持了mysql(`表名必须fs_session`),你可以自行扩展`FinalRepository`接口,以支持其他数据库。
```sql
CREATE TABLE `fs_session`
(
`id` varchar(64) NOT NULL,
`session` blob,
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
```xml
org.springframework.boot
spring-boot-starter-data-jdbc
```
忽略了数据库连接等,配置如下
```java
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
protected void configurer(FinalSessionProperties properties) {
// 默认会话存储于内存中,下面将会话存储于mysql中,需要引入JdbcTemplate依赖
properties.setRepository(new FinalDataBaseRepository(jdbcTemplate));
}
```
若默认方案不满意,可自行扩展`FinalRepository`接口进行自定义。final-session准备了许多可扩展接口,你可以尽情发挥你的idea。
### 其他
有问题issues,也可以邮箱:**ling-kang@qq.com**
也能打赏我:
