spring session jdbc

spring session jdbc, 无法设置成功,存储不到数据库,页面是jsp

img

img

img

img

img

你代码应该是没问题的,你看看target下的各个xml齐全否,尤其你说的那啥

如果你在使用 Spring Session JDBC 遇到了问题,无法成功将会话信息存储到数据库中,以下是一些常见的可能原因和解决方法:

  1. 数据源配置错误:首先,确保你的数据源配置正确,包括数据库的连接信息、驱动程序的引入和配置。你可以在 Spring 配置文件中设置数据源的相关属性,确保数据库连接正常。

    示例配置(以 HikariCP 数据源为例):

    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/session_db" />
        <property name="username" value="your_username" />
        <property name="password" value="your_password" />
    </bean>
    
  2. 数据库表创建错误:确保你已经正确地创建了存储会话信息的数据库表。Spring Session JDBC 需要特定的数据库表结构来存储会话信息。你可以使用 Spring Session 提供的脚本或手动创建表。确保表的结构与你的数据库配置相匹配。

    示例脚本(MySQL):

    CREATE TABLE SPRING_SESSION (
        PRIMARY_ID CHAR(36) NOT NULL,
        SESSION_ID CHAR(36) NOT NULL,
        CREATION_TIME BIGINT NOT NULL,
        LAST_ACCESS_TIME BIGINT NOT NULL,
        MAX_INACTIVE_INTERVAL INT NOT NULL,
        EXPIRY_TIME BIGINT NOT NULL,
        PRINCIPAL_NAME VARCHAR(100),
        CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
    );
    
    CREATE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
    CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
    
  3. 配置 Spring Session JDBC:确保你正确配置了 Spring Session JDBC,包括适当的 Bean 定义和属性设置。你需要在 Spring 配置文件中添加相关配置,以便 Spring Session 可以使用 JDBC 存储会话信息。

    示例配置:

    <bean id="sessionRepository"
          class="org.springframework.session.jdbc.JdbcIndexedSessionRepository">
        <constructor-arg ref="dataSource" />
        <property name="tableName" value="SPRING_SESSION" />
    </bean>
    
    <bean id="springSessionRepositoryFilter"
          class="org.springframework.session.web.http.SessionRepositoryFilter">
        <constructor-arg ref="sessionRepository" />
    </bean>
    

    请根据你的实际配置进行适当的调整。

  4. 确保正确使用会话:在你的 JSP 页面中,确保你正确使用了会话对象并进行了相关的会话操作。确保在会话期间添加、获取和删除属性时没有出现问题。

    示例 JSP 页面中使用会话属性的代码:

    <%@ page session="false" %>
    <%
        // 添加会话属性
        session.setAttribute("username", "John");
    
        // 获取会话属性
        String username = (String) session.getAttribute("username");
    
        // 删除会话属性
        session.removeAttribute("username");
    %>
    

如果你按照以上步骤进行配置和使用,并且仍然无法成功将会话信息存储到数据库中,请检查日志文件以获取更详细的错误信息,以便进一步调试和解决问题。

---_﹉﹉﹉﹉

怎么获取session属性?
import org.springframework.session.Session;
import org.springframework.session.SessionRepository;

// 通过SessionRepository获取Session对象
SessionRepository sessionRepository = ...; // 从Spring容器中获取SessionRepository实例
String sessionId = "your-session-id"; // 获取要操作的会话ID
Session session = sessionRepository.findById(sessionId);

// 通过Session对象获取属性值
Object attributeValue = session.getAttribute("attributeName");

远程看一下吧,这种问题只能根据详细的代码来排查问题所在

是不是你的数据库没有权限的问题。
建议查查数据库的对外权限

  1. 账户权限导致。
  2. 数据库启动时绑定的ip地址导致
  3. 数据库防火墙拦截。
  4. 如果使用云服务,云服务提供商需要开放端口。

参考官方配置
https://www.baeldung.com/spring-session-jdbc
https://docs.spring.io/spring-session/reference/guides/java-jdbc.html

首先确认下保存数据库时候是否会报错,如果不会报错,并且方法执行成功,那么可能是事务没有提交导致的,可以往这个方向排查下。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/723676
  • 这篇博客也不错, 你可以看下java中session存放对象,jsp页面获取session的对象值
  • 除此之外, 这篇博客: Spring Session的使用中的 集成Spring Session到Spring Boot 应用(JDBC) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    加入以下依赖

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    

    配置文件中加入以下内容

    spring:
      session:
      #配置session的保存方式
        store-type: jdbc
      datasource:
        url: jdbc:mysql://localhost:3306/hl7?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
        username: root
        password: adminadmin
    

    在数据库中创建对应的表结构,建表语句在spring-session-jdbc-.RELEASE.jar/org.springframework/session/jdbc/schema-mysql.sql

    CREATE TABLE SPRING_SESSION (
    	PRIMARY_ID CHAR(36) NOT NULL,
    	SESSION_ID CHAR(36) NOT NULL,
    	CREATION_TIME BIGINT NOT NULL,
    	LAST_ACCESS_TIME BIGINT NOT NULL,
    	MAX_INACTIVE_INTERVAL INT NOT NULL,
    	EXPIRY_TIME BIGINT NOT NULL,
    	PRINCIPAL_NAME VARCHAR(100),
    	CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (PRIMARY_ID)
    ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
    
    CREATE UNIQUE INDEX SPRING_SESSION_IX1 ON SPRING_SESSION (SESSION_ID);
    CREATE INDEX SPRING_SESSION_IX2 ON SPRING_SESSION (EXPIRY_TIME);
    CREATE INDEX SPRING_SESSION_IX3 ON SPRING_SESSION (PRINCIPAL_NAME);
    
    CREATE TABLE SPRING_SESSION_ATTRIBUTES (
    	SESSION_PRIMARY_ID CHAR(36) NOT NULL,
    	ATTRIBUTE_NAME VARCHAR(200) NOT NULL,
    	ATTRIBUTE_BYTES BLOB NOT NULL,
    	CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_PRIMARY_ID, ATTRIBUTE_NAME),
    	CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_PRIMARY_ID) REFERENCES SPRING_SESSION(PRIMARY_ID) ON DELETE CASCADE
    ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;
    
    
  • 以下回答来自chatgpt:

    问题可能出现的原因是没有正确配置Spring JDBC。请按照以下步骤检查和解决该问题:

    1. 确保在Spring Boot项目的pom.xml文件中已经添加了相应的依赖项,如下所示:
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    
    1. 在项目的配置文件(如application.yml或application.properties)中,添加如下的配置:
    spring:
      session:
        store-type: jdbc
      datasource:
        url: jdbc:mysql://localhost:3306/hl7?useUnicode=true&characterEncoding=UTF8&serverTimezone=UTC
        username: root
        password: adminadmin
    

    请确保url,username和password的值正确,与你的数据库配置相匹配。

    1. 确保在数据库中已经创建了正确的表结构。根据提供的参考资料,可以在spring-session-jdbc-.RELEASE.jar/org.springframework/session/jdbc/schema-mysql.sql中找到建表语句。请执行这些语句来创建相应的表。

    2. 在你的JSP页面中,确保已经使用了Spring Session提供的标签库。可以在jsp页面的开头添加以下标签库声明:

    <%@ taglib prefix="session" uri="http://www.springframework.org/tags/session" %>
    
    1. 确保在需要使用会话信息的地方,正确地使用了Spring Session提供的API,如获取会话属性等。例如,要在JSP页面中获取会话属性,可以使用以下代码:
    <session:getAttribute name="attributeName" />
    

    请将attributeName替换为要获取的属性的名称。

    如果你按照以上步骤执行并且仍然无法成功设置和存储会话信息到数据库中,请检查你的数据库连接是否正常,以及是否有其他相关的错误日志或异常信息供参考。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^