pom依赖
<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>
yml配置
spring:
data:
mongodb:
uri: mongodb://xx.xx.xx:27018/testmongo
server:
port: 9001
实现
package com.sunreal.mongosession;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.mongo.JdkMongoSessionConverter;
import org.springframework.session.data.mongo.config.annotation.web.http.EnableMongoHttpSession;
import java.time.Duration;
/**
* @author lkz
* @description 默认保存在sessions的集合中,过期时间1800秒
* @date 2021/1/28 14:36
*/
@Configuration
@EnableMongoHttpSession(maxInactiveIntervalInSeconds = 1200, collectionName = "mongo_session")
public class HttpSessionConfig {
/**
* 将session属性映射二进制持久化到mongo中
* @return
*/
@Bean
public JdkMongoSessionConverter jdkMongoSessionConverter() {
return new JdkMongoSessionConverter(Duration.ofMinutes(30));
}
}
package com.sunreal.demo;
import com.sunreal.mongosession.SessionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
/**
* @author lkz
* @description
* @date 2021/1/28 14:40
*/
@RequestMapping("/demo")
@RestController
public class DemoController {
@PostMapping("/login")
public String login(HttpSession session, @RequestBody User user) {
session.setAttribute("user", user);
return "login success";
}
@GetMapping("/findInfo")
public User findInfo(HttpSession session) {
return SessionUtils.getMongoSession(session, User.class, "user");
}
@PostMapping("/logout")
public String logout(HttpSession session) {
session.invalidate();
return "logout success";
}
}
@Data
public class User implements Serializable {
private String name;
private String password;
@JsonFormat(timezone = "GMT+8", pattern = "yyyyMMdd HH:mm:ss")
private Date date;
}
public class SessionUtils {
static Boolean DOMONGOTRACE = true;
public static <T> T getMongoSession(HttpSession session, Class<?> t) {
return getMongoSession(session,t,null);
}
/**
*
* @param session - httpsession
* @param t - xxx.class
* @param className - 注意全字母大写,session的key理论上装载以后就要全部大写
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T getMongoSession(HttpSession session,Class<?> t,String className) {
className = className == null? t.getSimpleName().toUpperCase() : className;
if(DOMONGOTRACE) {
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, new DateDeserializer()).setDateFormat(DateFormat.LONG).create();
return (T) gson.fromJson(gson.toJson(session.getAttribute(className)), t);
}else {
return (T) session.getAttribute(className);
}
}
}
public class DateDeserializer implements JsonDeserializer<Date> {
@Override
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new java.util.Date(json.getAsJsonPrimitive().getAsLong());
}
}