SpringSessionMongoDB

本文详细介绍了如何使用 Spring Session MongoDB 进行会话管理,包括 MongoDB 的安装配置,Spring Session MongoDB 的集成与配置,测试代码编写,以及如何共享自定义对象和设置 Session 失效时间。还讲解了 @EnableMongoHttpSession 注解的使用和如何更换序列化器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Session MongoDB

一、 Spring Session MongoDB 简介

1 什么是 Spring Session MongoDB

Spring Session MongoDB 是 Spring Session 的二级项目。其功能与 Spring Session 是相同的。Spring Session MongoDB 提供了一个 API 和实现,用于通过利用 Spring Data MongoDB来管理存储在 MongoDB 中的用户会话信息。

2 他与 Spring Session 的区别

Spring Session 与 Spring Session MongoDB 的作用是相同的。都是来解决 Session 共享问题。不同的是 Spring Session 默认的是依赖于 Redis 作为数据缓存平台,而 Spring Session MongoDB 是依赖于 MongoDB 来作为数据缓存平台的。

二、 Spring Session MongoDB 的使用

1 安装 MongoDB

1.1 下载 MongoDB

mongodb-linux-x86_64-4.0.9.tgz

1.2 解压 tgz 文件

[root@localhost temp]# tar -zxf mongodb-linux-x86_64-4.0.9.tgz

1.3 创建数据库目录

[root@localhost etc]# mkdir -p data/db

1.4 创建日志文件

[root@localhost etc]# touch mongodb.log

1.5 创建配置文件

[root@localhost etc]# vim mongodb.conf

1.6 启动 MongoDB

[root@localhost bin]# ./mongod --cofnig /usr/local/mongodb/etc/mongodb.conf

1.7 创建 sxt 库

use sxt

2 搭建案例环境

2.1 技术版本

JDK:1.8
Spring Boot:2.1.6RELEASE
Spring Session MongoDB:Bean-SR3

2.2 创建项目

在这里插入图片描述

在这里插入图片描述

2.3 修改 POM 添加依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.bjsxt</groupId>
    <artifactId>session_mongodb</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>session_mongo1</module>
        <module>session_mongo2</module>
    </modules>

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-bom</artifactId>
                <version>Bean-SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-mongodb</artifactId>
        </dependency>
    </dependencies>

</project>
2.4 添加配置文件
2.4.1Session_monog1
#配置服务的端口
server:
  port: 8080
#配置MongoDB的链接信息
spring:
  data:
    mongodb:
      host: 192.168.88.101
      port: 27017
      database: sxt
  #在SpringSession中没配置是因为SpringSession默认是基于redis做数据缓存的,SpringSessionMongoDB默认就是基于MongoDB的不配也可以
  session:
    store-type: mongodb
2.4.2Session_mongo2
#配置服务的端口
server:
  port: 8081
#配置MongoDB的链接信息
spring:
  data:
    mongodb:
      host: 192.168.88.101
      port: 27017
      database: sxt
  #在SpringSession中没配置是因为SpringSession默认是基于redis做数据缓存的,SpringSessionMongoDB默认就是基于MongoDB的不配也可以
  session:
    store-type: mongodb
2.5 创建启动类
2.5.1Session_mongo1
package com.bjsxt.mongo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession;

@SpringBootApplication
@EnableMongoHttpSession//调用session自动去MongoDB中存取
public class ApplicationMongo1 {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationMongo1.class, args);
    }
}
2.5.2Session_mongo2
package com.bjsxt.mongo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession;

@SpringBootApplication
@EnableMongoHttpSession//调用session自动去MongoDB中存取
public class ApplicationMongo2 {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationMongo2.class, args);
    }
}

3 编写测试代码

3.1Session_mongo1
package com.bjsxt.mongo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/service1")
public class Controller {

    /**
     * 将数据存放到HTTPSession中
     */
    @RequestMapping("/setMsg")
    public String setMsg(HttpSession session, String msg) {
        session.setAttribute("msg", msg);
        return "ok";
    }
}
3.2Session_mongo2
package com.bjsxt.mongo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/service2")
public class Controller {

    /**
     * 从HTTPSession中获取数据
     */
    @RequestMapping("/getMsg")
    public String getMsg(HttpSession session) {
        String msg = (String) session.getAttribute("msg");
        return msg;
    }
}
3.3 修改 MongoDB 的配置文件添加 bind_ip

如果不配置,mongodb只能允许当前主机连接,配置之后允许任何主机连接,去掉 auth=true 否则连接需要认证

在这里插入图片描述

3.4测试

在这里插入图片描述

在这里插入图片描述

4 共享自定义对象

4.1 创建 Users
package com.bjsxt.mongo.domin;

import java.io.Serializable;

/**
 * 需要实现序列化接口
 */
public class Users implements Serializable {
    private String userpwd;
    private String username;

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
4.2session_mongo1
/**
 * 获取数据封装Users
 */
@RequestMapping("/setUsers")
public String setUsers(HttpSession session, Users users) {
    session.setAttribute("u", users);
    return "ok";
}
4.3session_mongo2
/**
 * 从httpSession中获取Users
 */
@RequestMapping("/getUsers")
public Users getUsers(HttpSession session) {
    Users users = (Users) session.getAttribute("u");
    return users;
}
4.4测试

在这里插入图片描述

在这里插入图片描述

5 Spring Session MongoDB 的存结构

在这里插入图片描述

6 设置 Session 失效时间

删掉之前的数据

在这里插入图片描述

设置失效时间

在这里插入图片描述

失效时间到了之后不是立即删除数据,而是等一会

在这里插入图片描述

service2拿不到数据了

在这里插入图片描述

刷新service1再放一条数据,在失效时间内可以拿到

在这里插入图片描述

service1和service2共享一个session,service1 的失效时间是20S但service2是默认的1800S,如果service1的失效时间还没到,这时service2又去请求了,service2还能拿到数据是因为service2去请求的时候将session的失效时间重置了变成了1800S,session为失效,数据未销毁,所以还能拿到数据

7 @EnableMongoHttpSession 注解讲解

maxInactiveIntervalInSeconds:设置 Session 失效时间
collectionName:设置 MongoDB 的 Collections 的名称

在这里插入图片描述

设置collectionName为 sxtCollection

在这里插入图片描述

在这里插入图片描述

service2 未设置collectionName所以取不到数据 默认是去session这个集合中取的

在这里插入图片描述

在这里插入图片描述

但是在MongoDB中是有的

在这里插入图片描述

8 更换 Spring Session MongoDB 的序列化器

Spring Session MongoDB 默认使用的是 JDK 序列化器。

8.1 创建配置类添加 Jackson
package com.bjsxt.mongo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.mongo.JacksonMongoSessionConverter;

/**
 * 更换Spring Session MongoDB的序列化器
 */
@Configuration//让spring在启动时初始化这个类
public class SessionMongoConfig {
    @Bean
    JacksonMongoSessionConverter mongoSessionConverter() {
        return new JacksonMongoSessionConverter();
    }
}
8.2 修改实体类,添加@JsonAutoDetect 注解

在这里插入图片描述

package com.bjsxt.mongo.domin;

import com.fasterxml.jackson.annotation.JsonAutoDetect;

import java.io.Serializable;

/**
 * 需要实现序列化接口
 */
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)//忽略所有属性的自动检测
public class Users implements Serializable {
    private String userpwd;
    private String username;

    public String getUserpwd() {
        return userpwd;
    }

    public void setUserpwd(String userpwd) {
        this.userpwd = userpwd;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
8.3测试

在这里插入图片描述

在这里插入图片描述

service2 未更换序列化器所以报错

在这里插入图片描述
更换同款序列化器之后成功

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值