java 分布式会话_spring-session实现分布式集群session的共享

title: spring-session实现分布式集群session的共享

tags: springboot,spring,session共享

grammar_cjkRuby: true

**本文使用springboot实现session共享,基于spring session实现

想使用基于容器的session共享请搜索其他文章

本文不讲解基础环境搭建,需要使用idea、maven、springboot等相关知识点,不做介绍

未做session共享

整体项目结构

基础代码:

pom.xml

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

com.xiang.springboot.demo

springboot-demo

0.0.1-SNAPSHOT

jar

springboot-demo

Demo project for Spring Boot

org.springframework.boot

spring-boot-starter-parent

2.0.2.RELEASE

UTF-8

UTF-8

1.8

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-web

org.projectlombok

lombok

true

org.springframework.boot

spring-boot-starter-test

test

org.springframework.boot

spring-boot-maven-plugin

SpringbootDemoApplication.java

package com.xiang.springboot.demo;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.web.context.ServletContextAware;

import javax.servlet.ServletContext;

@SpringBootApplication

public class SpringbootDemoApplication implements ServletContextAware {

public static void main(String[] args) {

SpringApplication.run(SpringbootDemoApplication.class, args);

}

@Override

public void setServletContext(ServletContext context) {

String ctx = context.getContextPath();

System.out.println("ctx=" + ctx);

context.setAttribute("ctx", ctx);

}

}

TestController.java

package com.xiang.springboot.demo.module1.controller;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.GetMapping;

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

import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

@Controller

@RequestMapping("/module1")

public class TestController {

@GetMapping("/page1")

public String page1(HttpServletRequest request, HttpServletResponse response, RedirectAttributes attr, ModelMap map) {

System.out.println(attr.getFlashAttributes().get("test"));

System.out.println("aaaaaaaaaaaaaa" + map.get("test"));

HttpSession session = request.getSession();

session.setAttribute("sessiontest","session test text...."+session.getId());

String url = request.getScheme()+":111//"+request.getServerName()+":"+request.getServerPort()+"-"+request.getLocalPort()+"/"+request.getContextPath()+"/"+request.getRequestURI();

session.setAttribute("ctpath",url);

return "module1/page1";

}

@GetMapping("/page2")

public String page2(HttpServletRequest request, HttpServletResponse response, RedirectAttributes attr) {

attr.addFlashAttribute("test", "testaaaaa");

return "redirect:/module1/page1";

}

}

page1.html

Spring MVC + Thymeleaf Example

Hello,


ContextPath,

!


Hello,

!


session,

!

submit

未做session共享之前的结果

session共享

项目结构

整体项目结构与原来保持一致

pom.xml

原pom.xml中加入

org.springframework.boot

spring-boot-starter-redis

1.3.8.RELEASE

org.springframework.session

spring-session-data-redis

application.yml

将原来的application.properties改名了

加入:

spring:

redis:

database: 0

host: ***

port: 6379

password: ***

timeout: 0

pool:

max-active: 8

max-wait: -1

max-idle: 8

min-idle: 0

session:

store-type: none

加入新文件RedisHttpSessionConfig.java

package com.xiang.springboot.demo.module1.config;

import org.springframework.context.annotation.Configuration;

import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration

//maxInactiveIntervalInSeconds 默认是1800秒过期,这里测试修改为60秒

@EnableRedisHttpSession(maxInactiveIntervalInSeconds=60)

public class RedisHttpSessionConfig{

}

其他不用变

最终结果

---------------2018.06.20 更新-----------------------------------------------

使用spring session之后原httpsessionListener的创建和销毁session的监听器会失效

处理方法:https://docs.spring.io/spring...

代码如下:

@Configuration

//maxInactiveIntervalInSeconds 默认是1800秒过期,这里测试修改为60秒

@EnableRedisHttpSession(maxInactiveIntervalInSeconds=180)

public class RedisHttpSessionConfig{

@Bean

public SessionEventHttpSessionListenerAdapter getSessionEventHttpSessionListenerAdapter(){

List listeners = new ArrayList<>();

listeners.add(getHttpSessionListener());

return new SessionEventHttpSessionListenerAdapter(listeners);

}

@Bean

public HttpSessionListener getHttpSessionListener(){

return new MyHttpSessionListener();

}

}

---------------2018.06.20 更新end-----------------------------------------------

参考:

你可能感兴趣的:(java,分布式会话)