# shared-session-demo
**Repository Path**: llh-gitee/shared-session-demo
## Basic Information
- **Project Name**: shared-session-demo
- **Description**: Spring Session组件简单使用
- **Primary Language**: Unknown
- **License**: MulanPSL-1.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-05
- **Last Updated**: 2020-12-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Session共享小案例
在Spring中实现Session共享比较简单,也就是Spring-Session组件的使用。
## 配置
先添加依赖。
此处选用redis作为缓存库,所以redis相关的依赖,再加上session与redis集成依赖就可以了。其他的缓存产品也大同小异。
```xml
org.springframework.session
spring-session-data-redis
org.springframework.boot
spring-boot-starter-data-redis
```
其次再配置下redis连接。如下例:
```Java
@Configuration
@EnableRedisHttpSession
public class SessionConfig {
@Bean
public LettuceConnectionFactory connectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
// 使用redis的3号库
// 默认库写了太多其他的东西
// 此处redis的配置与配置文件中redis的属性是独立的
configuration.setDatabase(3);
return new LettuceConnectionFactory(configuration);
}
}
```
配置就写这么多,下面写个页面测试下。
## 测试
测试方法很简单:
```java
@GetMapping("")
public ModelAndView hello(ModelAndView mv, HttpSession session) {
session.setAttribute("aaa", LocalDateTime.now());
Object shared = session.getAttribute("shared");
if (shared == null) {
String value = "I am shared from " + port;
shared = value;
session.setAttribute("shared", value);
}
Object aaa = session.getAttribute("aaa");
mv.addObject("time", aaa);
mv.addObject("shared", shared);
mv.setViewName("hello");
return mv;
}
```
我们放入两个变量到session里,一个是当前时间,另一个带有第一次访问的端口号。如果session共享成功,那么再次以不同端口号启动当前项目将看到第一次的启动的端口号。如下图:
[](https://imgchr.com/i/wF7QPJ)
[](https://imgchr.com/i/wF7lG9)
表明的确实现了session共享。
*另外,session共享是在同一个浏览器实现的。两个浏览器是不行的。*
# IDEA启动多个项目
应该不会我是最后一个知道IDEA可以启动多个项目的吧,不会吧,不会吧。
先打开配置项

编辑配置项

1. 添加一个 Application 配置
2. 取个名字
3. 勾选允许并行运行
4. 找到启动类
5. 配置启动参数
配置完成就可以很方便地运行同一项目两次了。
# shiro的session共享
上面搞定了简单的session,加一点点难度,整下shiro的session共享。
## 配置
添加依赖:
```xml
org.apache.shiro
shiro-spring
1.5.2
org.crazycake
shiro-redis
2.4.2.1-RELEASE
compile
com.github.theborakompanioni
thymeleaf-extras-shiro
2.0.0
```
写点配置:
```java
@Bean
public DefaultWebSessionManager sessionManager() {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionDAO(redisSessionDAO());
return sessionManager;
}
@Bean
public RedisSessionDAO redisSessionDAO() {
RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
redisSessionDAO.setRedisManager(redisManager());
return redisSessionDAO;
}
@Bean
public RedisManager redisManager() {
// RedisManager redisManager = new RedisManager();
// redisManager.setHost(host);
// redisManager.setPort(port);
// // 配置缓存过期时间
// redisManager.setExpire(expireTime);
// redisManager.setTimeout(timeOut);
// redisManager.setPassword(password);
return new RedisManager();
}
```
这里主是把shiro的session操作替换为redis。其他配置就随便配配。
另外,为了测试方便,登录时直接通过,不会作验证的。
```java
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
Object principal = token.getPrincipal();
return new SimpleAuthenticationInfo(principal, "123", "MyShiroRealm");
}
```
## 测试
建立一个登录画面,登录成功后会重定向welcome画面,会显示登录名。

下面我们使用Jerry来登录
[](https://imgchr.com/i/wFz3kt)
[](https://imgchr.com/i/wFzlTI)