安装redis
$ wget http://download.redis.io/releases/redis-4.0.1.tar.gz
$ tar xzf redis-4.0.1.tar.gz
$ cd redis-4.0.1
$ make
配置redis.conf,允许外部连接
使用IntelliJ IDEA创建Spring Boot工程,选择web, redis, session.
LoginController.java
package com.example.springsessiondemo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@RequestMapping("/")
@ResponseBody
public String home(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user == null){
return "用好未登录" + session.getId();
} else {
return "用好已登录" + session.getId();
}
}
@RequestMapping("/login")
@ResponseBody
public String login(HttpServletRequest request){
User user = new User();
user.setUsername("chf");
user.setPassword("pass");
request.getSession().setAttribute("user", user);
return "登录成功 " + request.getSession().getId();
}
}
创建文件config.java
@Configuration
@ImportResource(locations={"classpath:spring.xml"})
public class Config {
}
配置文件application.yaml
server:
port: 8000
spring:
session:
store-type: redis
redis:
host: 10.0.0.201
port: 6379
password:
配置文件spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="defaultCookieSerializer" class="org.springframework.session.web.http.DefaultCookieSerializer">
<property name="domainName" value="example.com"/>
<property name="cookieName" value="JSESSIONID"/>
<property name="cookiePath" value="/" />
<!-- <property name="domainNamePattern" value="^.+?\.(\w+\.[a-z]+)$"></property>-->
</bean>
<bean id="redisHttpSessionConfiguration" class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="1800" />
<property name="cookieSerializer" ref="defaultCookieSerializer"/>
</bean>
</beans>
配置hosts文件
127.0.0.1 www.example.com
127.0.0.1 passport.example.com
运行程序,通过浏览器访问passport.example.com:8000
访问www.example.com:8000
JSESSIONID的内容相同,说明实现了会话共享。
接下来在passport进行登录
切换到www
一个简单的单点登录系统就实现了。
源代码工程
https://github.com/chenhaifeng2016/springsessiondemo