失效链接处理 |
Tomcat集群Session׃n PDF 下蝲
本站整理下蝲Q?/strong>
链接Q?a target="_blank">https://pan.baidu.com/s/1eszvEe5mPRc79j7ZlE35xg
提取码:n7dp
相关截图Q?/strong>
![]()
主要内容Q?/strong>
问题由来解决Ҏ(gu)
1. ZCookie+Redis+Filter解决Ҏ(gu)实现q程优缺点踩?/div>
2. Tomcat内置的Session复制Ҏ(gu)实现q程优缺?/div>
3. 使用Session_滞Ҏ(gu)实现形式优缺?/div>
4. ZSession持久化方?/div>
5. ZSpring-Session无R入性方案实现过E优~点
t坑l语
问题由来
当我们的业务使用单个Tomcat不以支持访问请求的时候,需要引入Tomcat集群。而每个Tomcat的Session是不互通的Q如果用L(fng)h落入C同的Tomcat中,用户需要频J的dQ给用户造成困扰。所以,在一个应用服务器产生Session之后Q应该让其他应用服务器也能够获取刎ͼ也就是Session׃n?/div>
解决Ҏ(gu)
以下几种Ҏ(gu)有的是查资料扑ֈ的,q没有花Ҏ(gu)间去实现Q我们可以根据自q实际情况选择使用哪一U。个人比较們于第1和第5U方案,因ؓ(f)q?U比较亲?/div>
1. ZCookie+Redis+Filter解决Ҏ(gu)
用户d之后Q将Session Id和用户信息存储到Redis中,q添加一个CookieQ将该Session Id带到客户端。当发v其他h之后Q携带该CookieQ应用服务器获取到Session Id之后去Redis中查询是否存在,如果存在则l进行相关业务,否则提示用户未登录。U在Cookie中存攄户信息的方式直接Pass掉了?/div>
实现q程
dq程
public ServerResponse<User> login(String username, String password, HttpSession session, HttpServletResponse response){
//获取数据库中的用户信?/div>
ServerResponse<User> serverResponse = iUserService.login(username,password);
if (serverResponse.isSuccess()){
String sessionId = session.getId();
//dCookie
CookieUtil.writeCookie(response,sessionId);
//sessionId和Json化的用户信息保存到分片的Redis?/div>
RedisShardedUtil.setEx(sessionId, JsonUtil.obj2String(serverResponse.getData()), Const.RedisCache.SESSION_EXTIME);
}
return serverResponse;
}
h“Session”有效旉
假设“Session”的默认时间设|ؓ(f)半个时Q当我们d之后Q每ơ请求都应该Session的有效期讄为半个小时。否则的话,一到半个小?ldquo;Session”失效了用戯得重新登录。ؓ(f)了解册个问题,我们讄一个过滤器Q?/div>
public class SessionExpireFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//ServletRequest转换为HttpServletRequest
HttpServletRequest request = (HttpServletRequest)servletRequest;
String token = CookieUtil.readCookieValue(request);
//如果token不ؓ(f)I的话,W合条gQ则获取user信息Quser不ؓ(f)I,则将redis~存中的session旉重置为指定时旉
if(StringUtils.isNotBlank(token)){
String userJsonStr = RedisShardedUtil.get(token);
User user = JsonUtil.string2Obj(userJsonStr,User.class);
if(user != null){
//如果user不ؓ(f)I,则重|session的时_卌用expire命o
RedisShardedUtil.expire(token, Const.RedisCache.SESSION_EXTIME);
}
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
|