代码拉取完成,页面将自动刷新
下面将演示session
存储于mysql
中
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
CREATE TABLE `fs_session`
(
`id` varchar(64) NOT NULL,
`session` longblob,
`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;
表名是fs_session
,开发中使用数据库不失是一种智慧!
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import top.lingkang.finalsession.FinalSessionConfig;
import top.lingkang.finalsession.core.FinalRepository;
import top.lingkang.finalsession.jakarta.FinalSession;
import top.lingkang.finalsession.utils.SerializationUtils;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* 数据库存储session
*
* @author lingkang
* Created by 2024/3/10
*/
public class FinalRepositoryDatasource implements FinalRepository<FinalSession> {
private DataSource dataSource;
@Override
public void initProperties(FinalSessionConfig config) {
// 配置数据库
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=true");
hikariConfig.setUsername("root");
hikariConfig.setPassword("123456");
hikariConfig.setMaximumPoolSize(20);
dataSource = new HikariDataSource(hikariConfig);
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
((HikariDataSource) dataSource).close();
}));
}
@Override
public FinalSession getSession(String id) {
Connection connection = null;
try {
connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement("select session from fs_session where id=?");
statement.setObject(1, id);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
byte[] bytes = resultSet.getBytes(1);
resultSet.close();
return (FinalSession) SerializationUtils.unSerialization(bytes);
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (connection != null && !connection.isClosed())
connection.close();
} catch (Exception e) {
}
}
return null;
}
@Override
public void setSession(String id, FinalSession session) {
Connection connection = null;
try {
connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement("select count(*) from fs_session where id=?");
statement.setObject(1, id);
ResultSet resultSet = statement.executeQuery();
boolean exists = false;
if (resultSet.next()) {
if (resultSet.getLong(1) > 0)
exists = true;
resultSet.close();
}
if (exists) {
// 存在就更新
statement = connection.prepareStatement("update fs_session set session=? where id=?");
statement.setObject(1, SerializationUtils.serialization(session));
statement.setObject(2, id);
statement.executeUpdate();
} else {
// 不存在就插入
statement = connection.prepareStatement("insert into fs_session(id,session) values(?,?) ");
statement.setObject(1, id);
statement.setObject(2, SerializationUtils.serialization(session));
statement.executeUpdate();
}
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (connection != null && !connection.isClosed())
connection.close();
} catch (Exception e) {
}
}
}
@Override
public void deleteSession(String id) {
Connection connection = null;
try {
connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement("delete from fs_session where id=?");
statement.setObject(1, id);
statement.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
try {
if (connection != null && !connection.isClosed())
connection.close();
} catch (Exception e) {
}
}
}
@Override
public void destroy() {
}
}
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import top.lingkang.finalsession.FinalSessionConfig;
import top.lingkang.finalsession.jakarta.FinalSessionFilter;
/**
* @author lingkang
* Created by 2024/3/10
*/
@Configuration
@Order(-1995)
public class MySessionConfigDatasource extends FinalSessionFilter {
@Override
protected void configurer(FinalSessionConfig config) {
// 使用redis存储session
config.setRepository(new FinalRepositoryDatasource());
}
}
至此,您可以愉快地使用多节点集群共享session了
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。