session底层就是服务器的一片内存空间,相当于map
优点:
缺点:
优点:
缺点:都是缺点,这只是一种思路。
优点:
• 只需要改nginx配置,不需要修改应用代码
• 负载均衡,只要hash属性的值分布是均匀的,多台 web-server的负载是均衡的
• 可以支持web-server水平扩展(session同步法是不行 的,受内存限制)
缺点:
• session还是存在web-server中的,所以web-server重 启可能导致部分session丢失,影响业务,如部分用户 需要重新登录
• 如果web-server水平扩展,rehash后session重新分布, 也会有一部分用户路由不到正确的session
• 但是以上缺点问题也不是很大,因为session本来都是有有 效期的。所以这两种反向代理的方式可以使用
优点:
• 没有安全隐患
• 可以水平扩展,数据库/缓存水平切分即 可
• web-server重启或者扩容都不会有 session丢失
缺点:
• 增加了一次网络调用,并且需要修改应 用代码;如将所有的getSession方法替 换为从Redis查数据的方式。redis获取数 据比内存慢很多
• 上面缺点可以用SpringSession完美解决
<!--引入springSession-->
org.springframework.session
spring-session-data-redis
#redis的连接信息
spring.redis.host127.0.0.1
spring.redis.port=6389
#session的类型
spring.session.store-type=redis
#session的过期时间
server.servlet.session.timeout=30m
//整合redis作为session存储
@EnableRedisHttpSession
@Configuration
public class GulimailSessionConfig {
@Bean
public CookieSerializer cookieSerializer(){
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
//指定作用域
cookieSerializer.setDomainName("");
//设定cookie名字
cookieSerializer.setCookieName("GULISESSION");
return cookieSerializer;
}
/**
* 设置序列化机制
* @return
*/
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer(){
return new GenericJackson2JsonRedisSerializer();
}
}
给容器中添加了组件
@PostMapping("/login")
public String login(UserLoginVO vo, RedirectAttributes redirectAttributes, HttpSession session){
//远程登录
R r = memberFeignService.login(vo);
if(r.getCode() == 0){
//往session中去保存数据
MemberRespVo data = r.getData(new TypeReference<MemberRespVo>(){});
session.setAttribute(AuthServerConstant.LOGIN_USER,data);
//成功就去首页
return "redirect:http://127.0.0.1:10000";
} else {
Map<String, String> errors =new HashMap<>();
errors.put("mag",r.getData(new TypeReference<String>(){}));
redirectAttributes.addFlashAttribute("errors",errors);
//失败就去登录页
return "redirect:http://127.0.0.1:20000/login.html";
}
}