spring-session-data-redis
引入依赖
pom.xml
<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>
添加配置
application.properties添加redis配置
#redis
spring.redis.database=0
spring.redis.host=your_host
spring.redis.port=6379
spring.redis.password=your_password
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=0
RedisHttpSessionConfiguration
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.session.data.redis.config.ConfigureRedisAction;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
/**
* RedisHttpSessionConfiguration的配置文件
* 引入RedisHttpSessionConfiguration.class
* maxInactiveIntervalInSeconds设置session在redis里的超时
*/
@Configuration
@EnableRedisHttpSession(redisNamespace = "wjjsaas:session")
public class RedisHttpSessionConfiguration {
/**
* cookie序列化器,用于配置cookie
* @return
*/
@Primary
@Bean
public CookieSerializer cookieSerializer() {
final DefaultCookieSerializer serializer = new DefaultCookieSerializer();
serializer.setCookieName("SAAS_JSESSIONID");
//如果项目是在子域名下使用时,建议直接配置成主域名如下
serializer.setCookiePath("/");
serializer.setUseHttpOnlyCookie(true);
serializer.setCookieMaxAge(60*60*24*30);
//serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
//serializer.setCookieMaxAge(sessionCookieConfig.getMaxAge());
//serializer.setJvmRoute();
//serializer.setUseSecureCookie();
//serializer.setUseBase64Encoding();
//serializer.setUseHttpOnlyCookie(false);
//serializer.setRememberMeRequestAttribute(SpringSessionRememberMeServices.REMEMBER_ME_LOGIN_ATTR);
return serializer;
}
}
@EnableRedisHttpSession注解用于开启RedisHttpSession,说明:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(RedisHttpSessionConfiguration.class)
@Configuration
public @interface EnableRedisHttpSession {
//Session默认过期时间,秒为单位,默认30分钟
int maxInactiveIntervalInSeconds() default MapSession.DEFAULT_MAX_INACTIVE_INTERVAL_SECONDS;
//配置key的namespace,默认的是spring:session,如果不同的应用共用一个redis,应该为应用配置不同的namespace,这样才能区分这个Session是来自哪个应用的
String redisNamespace() default RedisOperationsSessionRepository.DEFAULT_NAMESPACE;
//配置刷新Redis中Session的方式,默认是ON_SAVE模式,只有当Response提交后才会将Session提交到Redis
//这个模式也可以配置成IMMEDIATE模式,这样的话所有对Session的更改会立即更新到Redis
RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE;
//清理过期Session的定时任务默认一分钟一次。
String cleanupCron() default RedisHttpSessionConfiguration.DEFAULT_CLEANUP_CRON;
}
监听器
import com.guomin.demo.entity.User;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author
* @date 2020/08/14
*/
@Component
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
String user = (String) session.getAttribute("loginAccount");
List<Long> list = (List<Long>) session.getAttribute("list");
System.out.println(user + "logout");
System.out.println("list:" + list);
}
}
使用
import com.guomin.demo.dto.SysLoginDTO;
import com.guomin.demo.entity.User;
import com.guomin.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author
* @date 2020/08/13
*/
@RequestMapping("/user")
@RestController
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/login")
public User login(HttpServletRequest request, HttpServletResponse response, @RequestBody SysLoginDTO dto) {
User user = userService.userLogin(dto);
HttpSession session = request.getSession();
System.out.println(session.isNew());
session.setAttribute("loginAccount", user.getName());
List<Long> list = new ArrayList<>();
list.add(1L);
list.add(2L);
session.setAttribute("list", list);
return user;
}
@PostMapping("/get")
public User getUser(HttpServletRequest request) {
HttpSession session = request.getSession();
String loginAccount = (String)session.getAttribute("loginAccount");
User user = userService.getUser(loginAccount);
return user;
}
@PostMapping("/logout")
public String login(HttpServletRequest request) {
String user = (String) request.getSession().getAttribute("loginAccount");
request.getSession().invalidate();
return user + "登出";
}
}
生产中可能出现的问题
链接: link.
408

被折叠的 条评论
为什么被折叠?



