栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

分布式下的session问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分布式下的session问题

分布式下的session
    • 在分布式项目下
    • 项目中使用

在分布式项目下

session是一种会话状态,是储存在服务器上的,可以区分每个用户。浏览器会保存着对应的信息。浏览器保存的叫cookie。用户访问,浏览器会带上cookie让服务器识别。

如果是单体项目,session是在一个服务器下,所有的用户信息都保存在一个服务器,好做区分。

但是如果在分布式情况下,一个大的系统有很多模块,比如电商项目,有登录权限模块,商品模块,商品检索模块… 每个模块都是在不同的服务器上部署的,如果用户进行登录,session只在一个服务器上保存,其它服务器并不能同步。

痛点:解决session共享的问题。

这里就可以把session存储到一个公用的地方,各个模块都能取到的地方。如数据库, NoSql redis… 等。

而spring session框架正好能解决这个问题,更加简化我们的操作。

项目中使用

可以照着官网来。

pom.xml

        
            org.springframework.boot
            spring-boot-starter-data-redis
        

        
        
        
            org.springframework.session
            spring-session-data-redis
        

配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
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;



@EnableRedisHttpSession
@Configuration
public class HttpSessionConfig {

	// cookie 存储规则 确保在*.domain.com 同一个域名下及子域名
    @Bean
    public cookieSerializer cookieSerializer() {
        DefaultcookieSerializer serializer = new DefaultcookieSerializer();
        serializer.setcookieName("JSESSIONID");
        // 设置子域共享session
        serializer.setDomainName("yourdomain.com");
        return serializer;
    }

    // RedisSerializer
    @Bean
    public RedisSerializer springSessionDefaultRedisSerializer() {
        // 使用json方式序列化.. 保存用户的session信息
        return new GenericJackson2JsonRedisSerializer();
    }


}

 

yaml配置, 配置session以redis存储

spring:
  redis:
    host: 192.168.56.10
    port: 6379
  session:
    store-type: redis
    timeout: 30m

springmvc使用的话,还是使用HttpSession, 设置值就行了。
这个httpSession会经过过滤器,过滤将请求和响应用装饰器模式包装。

原理

public class SessionRepositoryRequestWrapper extends HttpServletRequestWrapper {

	// 原生request
	public SessionRepositoryRequestWrapper(HttpServletRequest original) {
		super(original);
	}

	public HttpSession getSession() {
		return getSession(true);
	}

	public HttpSession getSession(boolean createNew) {
		// create an HttpSession implementation from Spring Session
	}

	// ... other methods delegate to the original HttpServletRequest ...
}

经过过滤器后被包装。

public class SessionRepositoryFilter implements Filter {

	public doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		SessionRepositoryRequestWrapper customRequest =
			new SessionRepositoryRequestWrapper(httpRequest);

		chain.doFilter(customRequest, response, chain);
	}

	// ...
}
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号