当前位置: 首页 > news >正文

东城精锐传媒专注于各类网站建设网站主题模板下载不了

东城精锐传媒专注于各类网站建设,网站主题模板下载不了,科技创新的评价机制的作用,十堰网站优化点击上方蓝色字体#xff0c;选择“标星公众号”优质文章#xff0c;第一时间送达作者 | 张永恒来源 | urlify.cn/YjEZNj背景Shiro 提供了强大的 Session 管理功能#xff0c;基于 Shiro 实现 Session 共享非常方便#xff0c;只需要定制一个我们自己的SessionDAO#x… 点击上方蓝色字体选择“标星公众号”优质文章第一时间送达  作者 |  张永恒来源 |  urlify.cn/YjEZNj背景Shiro 提供了强大的 Session 管理功能基于 Shiro 实现 Session 共享非常方便只需要定制一个我们自己的SessionDAO并将它绑定给 SessionManager 即可。在我们的 SessionDAO 中通常会将 Session 保存到 Redis那么 Shiro 对 Session 的增删改查都会直接操作 Redis。但是由于 Shiro 对 Session 的访问非常频繁用户的一次请求可能就会触发几十次的 Session 访问操作在 Session 共享的场景下如果每次都访问 Redis势必会影响性能。应对思路本地缓存 Session将 Session 对象缓存于本地内存中能够有效减少从 Redis 中读取 Session 的次数。最简单的方案就是将 Session 对象保存到 request 域中那么在一次请求内只需要从 Redis 中获取一次之后就可以直接从当前 request 域中获取并且当请求结束后缓存会自动销毁不用担心内存泄漏。避免不必要的 Session 更新ShiroFilter 对每个请求都会检查 Session 是否存在如果存在则调用 SessionManager 的 touch() 方法将 Session 的 lastAccessTime 属性值更新为当前时间并调用 SessionDAO 的 update() 方法保存更新。由此可见当 Session 被创建出来之后用户的每个请求都会使 SessionDAO 的 update() 方法至少被调用一次。那么 Session 的 lastAccessTime 属性是干嘛用的呢有必要每个请求都去更新一下吗lastAccessTime 属性记录的是用户的上次访问时间它主要用于验证 Session 是否超时当用户访问系统时如果本次访问的时间距离上次访问时间超过了 timeout 阈值则判定 Session 超时。如果 lastAccessTime 的值不断更新那么 Session 就有可能永不超时。因此更新 lastAccessTime 属性值的操作可以认为是给 Session “续命”。既然是“续命”没必要每次都“续”(除非命真的很短)。我们可以重写 SessionManager 的 touch() 方法在更新过 lastAccessTime 属性的值后先不急着保存更新而是计算一下两次访问的时间间隔只有当它大于某个阈值时才去主动调用 SessionDAO 的 update() 方法来保存更新。这样也就大大降低了 Session 更新的频率。代码实现ShiroSessionDAO.javaRepositorypublic class ShiroSessionDAO extends AbstractSessionDAO {    private static final String SESSION_REDIS_KEY_PREFIX  session:;    Autowired    private RedisTemplate redisTemplate;    Override    protected Serializable doCreate(Session session) {        Serializable sessionId  generateSessionId(session);        assignSessionId(session, sessionId);        redisTemplate.boundValueOps(SESSION_REDIS_KEY_PREFIX  session.getId().toString()).set(session);return sessionId;    }    Override    public void update(Session session) throws UnknownSessionException {        redisTemplate.boundValueOps(SESSION_REDIS_KEY_PREFIX  session.getId().toString()).set(session);    }    Override    public void delete(Session session) {        redisTemplate.delete(SESSION_REDIS_KEY_PREFIX  session.getId().toString());        HttpServletRequest request  getRequest();if (request ! null) { // 一定要进行空值判断因为SessionValidationScheduler的线程也会调用这个方法而在那个线程中是不存在Request对象的            request.removeAttribute(session.getId().toString());        }    }    Override    protected Session doReadSession(Serializable sessionId) {        HttpServletRequest request  getRequest();if (request ! null) {            Session sessionObj  (Session) request.getAttribute(sessionId.toString());if (sessionObj ! null) {return sessionObj;            }        }        Session session  (Session) redisTemplate.boundValueOps(SESSION_REDIS_KEY_PREFIX  sessionId).get();if (session ! null  request ! null) {            request.setAttribute(sessionId.toString(), session);        }return session;    }    Override    public Collection getActiveSessions() {        Set keys  redisTemplate.keys(SESSION_REDIS_KEY_PREFIX  *);if (keys ! null  !keys.isEmpty()) {            List sessions  redisTemplate.opsForValue().multiGet(keys);if (sessions ! null) {return sessions.stream().map(o - (Session) o).collect(Collectors.toList());            }        }return Collections.emptySet();    }    private HttpServletRequest getRequest() {        ServletRequestAttributes requestAttributes  (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();return requestAttributes ! null ? requestAttributes.getRequest() : null;    }}ShiroConfig.javaConfigurationpublic class ShiroConfig {    Bean    public SessionManager sessionManager(SessionDAO sessionDAO) {        DefaultWebSessionManager sessionManager  new DefaultWebSessionManager() {            Override // 重写touch()方法降低Session更新的频率            public void touch(SessionKey key) throws InvalidSessionException {                Session session  doGetSession(key);                if (session ! null) {                    long oldTime  session.getLastAccessTime().getTime();                    session.touch(); // 更新访问时间                    long newTime  session.getLastAccessTime().getTime();                    if (newTime - oldTime  300000) { // 如果两次访问的时间间隔大于5分钟主动持久化Session                        onChange(session);                    }                }            }        };                sessionManager.setSessionDAO(sessionDAO); // 绑定SessionDAO        SimpleCookie sessionIdCookie  new SimpleCookie(sessionId);        sessionIdCookie.setPath(/);        sessionIdCookie.setMaxAge(8 * 60 * 60); // 单位秒数        sessionManager.setSessionIdCookie(sessionIdCookie); // 绑定Cookie模版                sessionManager.setSessionIdUrlRewritingEnabled(false);        sessionManager.setGlobalSessionTimeout(60 * 60 * 1000);        sessionManager.setSessionValidationSchedulerEnabled(true);        sessionManager.setSessionValidationInterval(2 * 60 * 60 * 1000);        sessionManager.setDeleteInvalidSessions(true);                return sessionManager;    }    ... 略 ...}Configurationpublic class ShiroConfig {    Bean    public SessionManager sessionManager(SessionDAO sessionDAO) {        DefaultWebSessionManager sessionManager  new DefaultWebSessionManager() {            Override // 重写touch()方法降低Session更新的频率            public void touch(SessionKey key) throws InvalidSessionException {                Session session  doGetSession(key);                if (session ! null) {                    long oldTime  session.getLastAccessTime().getTime();                    session.touch(); // 更新访问时间                    long newTime  session.getLastAccessTime().getTime();                    if (newTime - oldTime  300000) { // 如果两次访问的时间间隔大于5分钟主动持久化Session                        onChange(session);                    }                }            }        };                sessionManager.setSessionDAO(sessionDAO); // 绑定SessionDAO        SimpleCookie sessionIdCookie  new SimpleCookie(sessionId);        sessionIdCookie.setPath(/);        sessionIdCookie.setMaxAge(8 * 60 * 60); // 单位秒数        sessionManager.setSessionIdCookie(sessionIdCookie); // 绑定Cookie模版                sessionManager.setSessionIdUrlRewritingEnabled(false);        sessionManager.setGlobalSessionTimeout(60 * 60 * 1000);        sessionManager.setSessionValidationSchedulerEnabled(true);        sessionManager.setSessionValidationInterval(2 * 60 * 60 * 1000);        sessionManager.setDeleteInvalidSessions(true);                return sessionManager;    }    ... 略 ...}新款SpringBoot在线教育平台开源了精品帖子大汇总一把“乐观锁”轻松搞定高并发下的幂等性问题(附视频教程)一文搞懂Java8 Lambda表达式(附视频教程)感谢点赞支持下哈
http://www.sadfv.cn/news/364163/

相关文章:

  • 瑞丽网站建设不锈钢网站建设
  • 深圳html5网站开发多少钱wordpress搜索结果模板
  • 苏宁易购网站上的营销页面wordpress幻灯片名
  • 韩国虚拟空间网站一刻相册有多少免费空间
  • 网站开发文档需求撰写word做个人网站要多少钱
  • 东平网站建设在线培训系统
  • 在哪可以找到做网站的广州 网站建设 制作
  • 网站建设成功案例书籍桂林论坛网站有哪些
  • 广州技术支持 网站建设网站栏目策划方案
  • 网站付费推广方式中国建筑校园招聘官网
  • 如何让自己网站排名提高广州正规网站制作维护
  • 延吉有没有做网站的建设项目自主验收公示的网站
  • 珠海网站制作费用中小学校园网站建设
  • 建设自己的网站需要哪些步骤上海缘魁网站建设
  • 涉密项目单位网站建设流程做公司网站多钱
  • 一个网址建多个网站_网站建设网站
  • 如何做漂亮的网站雅布设计中国分公司在哪里
  • 河北电子网站建设wordpress 数据乱码
  • uc官方网站开发中心苏州网站建设推广案例
  • 金耀网站建设网站制作婚纱网站建设 最开始
  • 游戏门户网站建设深圳苍松大厦 网站建设
  • 西安网站建设全包常用的网页制作工具有什么
  • 台州建站网站模板网页导航栏设计图片
  • 如何提升网站搜索排名网站做301根目录在哪里
  • 佳木斯市网站建设广州住房和城乡建设部网站
  • 做网站开发 甲方提供资料深圳专业做网站开发费用
  • 搜狗竞价绑定网站要求网站建设情况总结
  • 广州康体设备网站建设大丰做网站建设的公司
  • 网站建设制作与运营免费公司网页制作
  • 网站关键词在哪设置招人在哪里找最快