我们架构的改变会牵涉代码的改变,架构是一步一步演进的,代码也要一步一步演进,相信这个过程能够学到很多很多,如果重置redis的一个时间,我们先来到代码里边,首先我们这个实现方案是通过过滤器来实现,过滤所有.do请求结尾的,然后在里面进行一个判断,并把session进行一个重置时间,首先在Controller里面,加一个common包,这个common包不同于上面的common包,上面的是业务上实现的各种common,而这个common加到controller里,它会对Controller造成影响,我们在这里加一个类,SessionExpireFilter,这么一个类,他来实现Filter这个接口,这个Filter不要导错包,导入javax.servlet里面的filter,然后实现他的方法,因为它是一个接口,初始化和destroy我们就不写了,我们继续写,主要是写doFilter,首先要做的是,把ServletRequest强转成HttpServletRequest,因为HttpServletRequest继承ServletRequest,然后我们拿到loginToken,这里面要做一个判断,用Apache的一个包,如果拿到的一个cookie,也就是mmall_login_token不是空,那我们就用redis里面拿user,这个用户的JSON字符串,然后对他进行反序列化,那这里要判断一下,如果user不等于空,这里面的逻辑就是说,先判断loginToken,是否为空,或者空字符串
    /*** <p>Checks if a String is not empty ("") and not null.</p>** <pre>* StringUtils.isNotEmpty(null)      = false* StringUtils.isNotEmpty("")        = false* StringUtils.isNotEmpty(" ")       = true* StringUtils.isNotEmpty("bob")     = true* StringUtils.isNotEmpty("  bob  ") = true* </pre>** @param str  the String to check, may be null* @return <code>true</code> if the String is not empty and not null*/public static boolean isNotEmpty(String str) {return !StringUtils.isEmpty(str);}
    /*** <p>Checks if a String is empty ("") or null.</p>** <pre>* StringUtils.isEmpty(null)      = true* StringUtils.isEmpty("")        = true* StringUtils.isEmpty(" ")       = false* StringUtils.isEmpty("bob")     = false* StringUtils.isEmpty("  bob  ") = false* </pre>** <p>NOTE: This method changed in Lang version 2.0.* It no longer trims the String.* That functionality is available in isBlank().</p>** @param str  the String to check, may be null* @return <code>true</code> if the String is empty or null*/public static boolean isEmpty(String str) {return str == null || str.length() == 0;}
如果不为空,符合条件,继续拿user信息,这里面还判断一下,如果user不为空,则重置session的时间,既调用expire命令,那我们这个filter就写完了,这里面的逻辑是非常简单的,我们还要在web.xml中把filter配置上
package com.mmall.controller.common;import com.mmall.common.Const;
import com.mmall.pojo.User;
import com.mmall.util.CookieUtil;
import com.mmall.util.JsonUtil;
import com.mmall.util.RedisShardedPoolUtil;
import org.apache.commons.lang.StringUtils;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** * @author Leon.Sun**/
public class SessionExpireFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;String loginToken = CookieUtil.readLoginToken(httpServletRequest);if(StringUtils.isNotEmpty(loginToken)){//判断logintoken是否为空或者"";//如果不为空的话,符合条件,继续拿user信息String userJsonStr = RedisShardedPoolUtil.get(loginToken);User user = JsonUtil.string2Obj(userJsonStr,User.class);if(user != null){//如果user不为空,则重置session的时间,即调用expire命令RedisShardedPoolUtil.expire(loginToken, Const.RedisCacheExtime.REDIS_SESSION_EXTIME);}}filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {}
}
    public interface RedisCacheExtime{int REDIS_SESSION_EXTIME = 60 * 30;//30分钟}
重置session时间的filter,首先加一个filter节点<filter><filter-name>sessionExpireFilter</filter-name><filter-class>com.learn.controller.common.SessionExpireFilter</filter-class></filter><filter-mapping><filter-name>sessionExpireFilter</filter-name><url-pattern>*.do</url-pattern></filter-mapping>全是以do结尾的都走这个拦截器,来重置它的session时间,那这个sessionFilter就加完了
我们TOMCAT集群在横线扩展的时候,想达到这种效果,就会衍生出来各种的一系列问题,例如我们一开始把SESSION,通过cookie,都写到redis里面,同时也能读到,但是我们还要考虑,session有效期的问题,所以我们又加了一个expireFilter,因为TOMCAT集群非常非常重要,能够提高大家的思维能力,架构能力,还有编码能力,最重要的实战经验

单点登录之SessionExpireFilter重置session有效期相关推荐

  1. 详解比springSecurity和shiro更简单优雅的轻量级Sa-Token框架,比如登录认证,权限认证,单点登录,OAuth2.0,分布式Session会话,微服务网关鉴权

    文章目录 1. 技术选型 2. Sa-Token概述 2.1 简单介绍 2.2 登录认证 2.3 权限认证 3. 功能一览 4. Sa-Token使用 4.1 引入Sa-Token依赖 4.2 Sa- ...

  2. 单点登录系统(SSO)和Session共享解释

    在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便. 但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录 ...

  3. 关于单点登录中同一浏览器session信息共享的又一解决办法

    之前对单点登录的初步理解链接基础上 https://blog.csdn.net/thebestway/article/details/100059456 由于又一次写项目,我又一次考虑了单点登录问题, ...

  4. 单点登录实现(spring session+redis完成session共享)

    一.前言 项目中用到的SSO,使用开源框架cas做的.简单的了解了一下cas,并学习了一下 单点登录的原理,有兴趣的同学也可以学习一下,写个demo玩一玩. 二.工程结构 我模拟了 sso的客户端和s ...

  5. sso单点登录系统(解决session共享)

    场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...

  6. 分布式Session与单点登录

    文章目录 一.分布式Session 1.1 分布式Session解决方案 2.2 SpringSession 二.单点登录 一.分布式Session 单体项目中我们使用Session和Cookie保存 ...

  7. cas单点登录原理碎碎念

    2019独角兽企业重金招聘Python工程师标准>>> 也许有一天,你去面试,当面试官问你做cas的经验的时候,你会怎么描述? cas单点登录的原理? 单点登录是分为基于sessio ...

  8. 笔记总结: 单点登录

    参考文章(提前鸣谢) 我的师父把 「JWT 令牌」玩到了极致 话说单点登录 什么是单点登录(SSO) Spring Session解决Session共享 美团面试官:说说什么是单点登录?什么是SSO? ...

  9. JSON Web Token (JWT)笔记(token实现单点登录功能)

    文章目录 前情提要 cookie(储存在用户本地终端上的数据) Cookie特点: session(web服务端内存) cookie和session 单点登录(只登录一次,可使用账号下全部服务)三种方 ...

最新文章

  1. 轮播切换_javascript基础(一)——轮播图
  2. 定制CE系统随笔-续1
  3. linux文件操作篇 (一)文件属性与权限
  4. [转] Nodejs 进阶:Express 常用中间件 body-parser 实现解析
  5. 为什么采用4~20mA的电流来传输模拟量?
  6. 【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?...
  7. PHP学习笔记6:面向对象的PHP
  8. 自动白平衡之完美反射算法原理及C++实现
  9. linux中chkconfig 启动程序顺序介绍
  10. table row设置cell的html,css中display设置为table、table-row、table-cell后的作用及其注意点...
  11. TypeScript 学习一 参数,函数,析构表达式
  12. ArcGIS 10.6 Data Interoperability Tools的安装与使用(附安装包下载)
  13. Java基础学习-IO流
  14. java list 取两条_java list集合中有多条数据随机两条一组
  15. MySQL8.0数据库基础教程(二)-理解关系
  16. 软考中级哪一门比较好过?我建议你考这个。
  17. 详解RS485电路,就是那么简单!
  18. 《Mysql必知必会》笔记
  19. 华为5G CPE是做什么用的?
  20. 中国科技大学网络视频课程软件设计模式(自主模式)

热门文章

  1. windows下nodejs环境配置
  2. Android调用手机中的应用市场,去评分的功能实现
  3. 检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005...
  4. 数字图像处理之空间域图像增强
  5. 从零开始学习C# 2
  6. .net中javascript去调用webservice
  7. 在Visual Studio 2005中安装Qt 4.3.2
  8. Json学习总结(1)——Java和JavaScript中使用Json方法大全
  9. Java中常见数据结构Map之LinkedHashMap
  10. 声音分析软件公司Cogito完成1500万美元B轮融资