2301_76744228 2025-08-29 10:09 采纳率: 0%
浏览 10

spring boot 的session无法提交到 redis

spring boot 的session无法提交到 redis

引入了依赖

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

设置了配置文件


spring:
  data:
    redis:
      host: 192.168.11.123
      port: 6379            
      password:             
      lettuce:
        pool:
          max-active: 100    
          max-idle: 50       
          min-idle: 10       
  session:
    redis:
      namespace: "spring:session"   
      flush-mode: on_save             
      save-mode: always               
  application:
    name: demo1
  server:
    port: 8080
    servlet:
      session:
        timeout: 1800
        cookie:
          http-only: true   
          secure: false     

在controller层

package com.example.demo;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/session1")
public class SessionController {

@GetMapping("/test")
public String testSession(HttpServletRequest request) {
    HttpSession session = request.getSession();
    return "Session created: " + session.getId() + ", New: " + session.isNew();
}
}

在网页

img

日志显示

img


ERROR 5944 --- [demo1] [nio-8080-exec-1] s.e.ErrorMvcAutoConfiguration$StaticView : Cannot render error page for request [/session1/test] as the response has already been committed. As a result, the response may have the wrong status code.

redis连接应该是没有问题的,可以不通过session向redis存放数据,恳请指正一下

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-08-29 10:24
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    根据你的描述,你已经正确引入了 spring-boot-starter-data-redisspring-session-data-redis 依赖,并且配置了 Redis 的连接信息和 session 相关的参数。但问题在于 Spring Boot 的 session 无法提交到 Redis


    ✅ 一、问题分析

    1. 依赖是否正确?

      • 你引入了 spring-boot-starter-data-redisspring-session-data-redis,这是正确的。
      • 但需要注意:如果你使用的是 Spring Boot 2.x 或更高版本,spring-session-data-redis 已经被弃用或整合到了 spring-boot-starter-data-redis,所以请确认你使用的 Spring Boot 版本。
    2. 配置文件是否完整?

      • 你配置了 spring.data.redis.hostportpassword 等信息,但没有看到关于 spring.session.redis.namespace 的详细设置(虽然你设置了)。
      • 你可能遗漏了关键的配置项,比如 spring.session.store-type=redis,这个是必须的。
    3. Session 是否真正被存储?

      • 你提到“可以不通过 session 向 redis 存放数据”,这说明 Redis 连接是正常的。
      • 但是 session 没有被写入 Redis,可能是由于配置错误或 session 被禁用了。
    4. 日志中出现的错误:

      • Cannot render error page for request [/session1/test] as the response has already been committed.
      • 这个错误通常不是 session 无法存入 Redis 的直接原因,而是与请求处理过程中的异常有关。

    ✅ 二、解决方案

    1. 确保 spring.session.store-type 配置正确

    application.ymlapplication.properties 中添加以下配置:

    spring:
      session:
        store-type: redis
    

    重点:这个配置是启用 Redis Session 的关键!


    2. 检查 Redis 连接配置是否完整

    确保你的 Redis 配置如下(特别是 lettuce.pool 部分):

    spring:
      data:
        redis:
          host: 192.168.11.123
          port: 6379
          password: 
          lettuce:
            pool:
              max-active: 100
              max-idle: 50
              min-idle: 10
    

    如果 Redis 密码为空,请确保不要留空字符串,或者使用 "" 表示空密码。


    3. 检查 Spring Boot 版本与依赖兼容性

    如果你使用的是 Spring Boot 2.4+spring-session-data-redis 可能已经被移除,你需要使用以下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    

    并且不需要单独引入 spring-session-data-redis,因为 Spring Boot 2.4+ 已经内置支持 Redis Session。


    4. 检查 session 是否被启用

    确保你在主类上添加了 @EnableRedisHttpSession 注解(仅在 Spring Boot 2.4 之前需要):

    @SpringBootApplication
    @EnableRedisHttpSession
    public class DemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    }
    

    注意:从 Spring Boot 2.4 开始,这个注解不再是必需的。


    5. 验证 Redis 中是否有 session 数据

    你可以使用 Redis 客户端工具(如 redis-cli)连接 Redis 并查看是否有 session 数据:

    redis-cli -h 192.168.11.123 -p 6379
    

    然后执行以下命令查看 key:

    KEYS spring:session:* 
    

    如果没有任何 key 返回,说明 session 没有被正确写入 Redis。


    6. 修改后的完整配置示例(application.yml)

    spring:
      application:
        name: demo1
      server:
        port: 8080
        servlet:
          session:
            timeout: 1800
            cookie:
              http-only: true
              secure: false
      data:
        redis:
          host: 192.168.11.123
          port: 6379
          password: 
          lettuce:
            pool:
              max-active: 100
              max-idle: 50
              min-idle: 10
      session:
        redis:
          namespace: "spring:session"
          flush-mode: on_save
          save-mode: always
        store-type: redis
    

    ✅ 三、测试代码(可选)

    你可以添加一个简单的测试方法来验证 session 是否被写入 Redis:

    @GetMapping("/test")
    public String testSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        session.setAttribute("testKey", "testValue");
        return "Session created: " + session.getId() + ", New: " + session.isNew();
    }
    

    访问 /session1/test,然后查看 Redis 中是否有 spring:session:... 的 key。


    ✅ 四、总结

    | 问题 | 解决方案 | |------|----------| | session 没有存入 Redis | 添加 spring.session.store-type: redis | | Redis 连接配置不完整 | 检查并完善 Redis 配置 | | Spring Boot 版本问题 | 确保依赖和配置与版本匹配 | | session 没有被启用 | 检查是否需要 @EnableRedisHttpSession | | 日志错误不影响 session 写入 | 该错误通常是请求处理问题 |


    ✅ 五、最终建议

    • 如果你使用的是 Spring Boot 2.4+,请确保你只保留 spring-boot-starter-data-redis 依赖。
    • 使用 KEYS spring:session:* 命令检查 Redis 中是否有 session 数据。
    • 如果仍然无法解决,请提供完整的项目结构和日志信息,以便进一步排查。

    如有更多问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月29日