分布式应用session会话管理-基于redis

随着应用的分布式部署,Session共享成为挑战。本文探讨了多种解决方案,如粘性请求、数据库存储、Cookie、服务器内部复制以及NoSQL(如Redis)。重点讲解了利用Redis实现Session管理的步骤,包括实现HttpSession接口、包装HttpServletRequest和使用Filter。登录成功后,生成加密的Token令牌存储在Cookie中,以此增强安全性。对于无Cookie情况,提出了后续讨论的话题。
摘要由CSDN通过智能技术生成

session会话在单台服务器下不会出现共享问题,现在应用部署方式都是分布式,或者集群部署,这样必然会面临一个问题,session共享


session共享的解决方案也有很多,


一、web服务器的粘性请求,比如采用nginx请求分发,使用ip_hash这种负载均衡方式,客户端请求只会被分发到相同的后台server,这样可以避免session共享的问题。但是缺点也很明显

二、基于数据库存储(网站用户量大的情况下,频繁dml数据,对db压力大)

三、基于cookie存储(安全问题、虽然可以加密存储、但是我觉得永远不能将敏感数据放在客户端,不信任啊O(∩_∩)O哈哈~)

四、服务器内置的session复制域(比如was下提供session复制功能、但这个损耗服务器内存)

五、基于nosql(memcache、redis都可以)






http请求是无状态的


这里要引入一个概念sessionidsession对象当客户端首次访问时,创建一个新的session对象.并同时生成一个sessionId,并在此次响应中将sessionId以响应报文的方式些回客户端浏览器内存或以重写url方式送回客户端,来保持整个会话

也就是说客户端request请求时候,如果获取了session,就默认分配一个jessionid,然后通过response响应到客户端cookie,然后客户端下一次请求,默认会携带这个jessionid请求到服务端,服务端拿到这个jessionid来区分不同的客户端。


说清楚这些,就可以从sessionid入手了,要实现将session信息存入redis,总结了下大概是三点:

1.实现httpsession接口,重写我们需要用到的方法,比如set get这些。。balabala一堆......

2.继承HttpServletRequestWrapper,这个类里面有getSession()方法,我们需要重写,来取自定义session

3.实现filter,用来拦截客户端请求,获取我们自定义的request,从而获得session


具体实现:

1.实现httpsession接口

public class HttpSessionWrapper implements HttpSession {
    protected final Logger logger = LoggerFactory.getLogger(getClass());
	private String sid = "";
	private HttpServletRequest request;
	private HttpServletResponse response;
	private final long creationTime = System.currentTimeMillis();
	private final long lastAccessedTime = System.currentTimeMillis();
	private SessionMeta meta;
	public Http
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值