session跨域就是摒弃了系统(Tomcat)提供的Session,而使用自定义的类似Session的机制来保存客户端数据的一种解决方案。
spring-session技术是spring提供的用于处理集群会话共享的解决方案。spring-session技术是将用户session数据保存到三方存储容器中,如:mysql,redis等。
Spring-session技术是解决同域名下的多服务器集群session共享问题的。不能解决跨域session共享问题。
1.通过jdbc实现session保存
使用: 配置一个Spring提供的Filter,实现数据的拦截保存,并转换为spring-session需要的会话对象。必须提供一个数据库的表格信息(由spring-session提供,找spring-session-jdbc.jar/org/springframework/session/jdbc/*.sql,根据具体的数据库找对应的SQL文件,做表格的创建)。
spring-session表:保存客户端session对象的表格。
spring-session-attributes表:保存客户端session中的attributes属性数据的表格。
spring-session框架,是结合Servlet技术中的HTTPSession完成的会话共享机制。在代码中是直接操作HttpSession对象的。
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;
pom:
<!-- 数据库session管理 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-jdbc</artifactId> </dependency>此处需要注意版本冲突,坑死我了。
配置文件:
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://xxx:3306/zmq username: root password: xxx session: store-type: jdbc #Spring Boot将会应用相当于手动添加@EnableJdbcHttpSession注解的配置。 #创建一个实现了Filter的名为springSessionRepositoryFilter的Bean(过滤器)。这个过滤器负责使用Spring Session支持的实现去替换HttpSession。 #server.session.timeout= # Session超时时间(秒) #spring.session.jdbc.initializer.enabled= # 如果有需要,在启动时可创建必要的Session表。如果默认的表名已经配置或者个性化模式中已经配置,则自动启动。 #spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # 初始化数据库schema的SQL脚本目录。 #spring.session.jdbc.table-name=SPRING_SESSION # 用于存储会话的数据库表名。 mybatis: typeAliasesPackage: com.oss.springsesssion.bean config-location: classpath:mybatis/mybatis.xml mapper-locations: classpath:mapper/*.xml debug: true server: port: 8888 session: 1800 # Session超时时间(秒)结果:
redis实现session共享。
pom:
<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: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://x.x.x:3306/zmq username: root password: x session: #tore-type: jdbc tore-type: redis redis: flush-mode: on_save namespace: spring:session redis: host: 127.0.0.1 port: 6379 timeout: 5000配置类上:
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 6000) //主类首先开启EnableRedisHttpSession注解结果:
其配置nginx可以实现分布式功能。单点登陆
代码:https://github.com/timeday/oss-spring-session
文档:https://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/guides/boot-jdbc.html