WEB页面定时刷新实现Session永不超时

          众所周知,当用户登录网站后较长一段时间没有与服务器进行交互,将会导致服务器上的用户会话数据(即session)被销毁。此时,当用户再次操作网页时,如果服务器进行了session校验,那么浏览器将会提醒用户session超时,导致这个问题的关键词有两个:一个是「长时间」,一个是「未操作」。    

防止session超时,我们一般采用的方式有两种:1、延迟session超时时间 2、(在规定的session超时时间内)隔一定时间与服务器交互。

  一、 延长服务器的session超时时间。ps:在Tomcat服务器的WEB.xml有如下节点内容: 

<session-config><session-timeout>30</session-timeout></session-config>;

      这里的30表示session的超时时间,单位为分钟,如果用户登录后在30分钟内没有与服务器交互,

    那么当前用户的session将失效。我们可以配置一个更大的数值(比如60),

    就可以延长session的超时时间,如果将该值改为0或负数的话,则表示session永不失效。

 

  不过在实际的工作应用中,一味地上调session的超时时间设置并不怎么常见,

  大多数需要实现该功能的网站都将解决问题的焦点集中在另一种思路上。

   例如:一些在线网站均采用定时刷新页面的方法来防止session超时。

      二、定时刷新页面。最常见的有两种实现方式:一种是通过JavaScript+HTMLDOM,另一种则是通过meta标签来实现。

   1)JavaScript+HTMLDOM,示例代码如下:

function refresh(seconds)
{
    setTimeout("self.location.reload()",seconds*1000);
}
refresh(600);//调用方法启动定时刷新,数值单位:秒。

    2)通过meta标签来实现(在页面中添加meta标签refresh也可以指定每隔指定时间就刷新当前页面),示例代码如下: 

<metahttp-equiv="refresh"content="600"/>

    上述meta标签可以实现每过600秒就刷新一次当前页面。

    在上述两种方案中,较好的为第二种,因为如果当前页面是在IE浏览器的模式窗口中打开的,默认情况下,

    self.location.reload()方法将会失效,而refreshmeta标签在IE模式窗口下仍然有效。

    上述两种方式都实现了刷新当前页面,并且使用起来非常简单,不过很遗憾的是,它们存在一种几乎致命的缺陷。试想一下,如果在论坛发帖等需要用户输入内容的页面,用户花费较长的时间输    入了许多文本内容,可是突然遇到了一个定时页面刷新,结果用户输入的所有内容都没了,估计这个时候用户连掐死你的心都有了……

 

因此我们需要在当前页面本身不刷新、不影响用户的任何操作的情况下实现定时刷新。最常见的解决方法仍然有两种。

  1、在当前页面添加一个隐藏的iframe,然后在该iframe里面实现定时刷新。

  2、使用JavaScript Image对象来实现定时刷新,(服务器的响应可以是文字等非图片内容,非图片内容只会造成图像加载失败,而我们的图像标签本身就是隐藏的,不管是加载成功还是失败都不    会显示,毕竟我们的主要目的是发送请求给服务器,让服务器保持session处于活动状态。)

  3、使用Ajax来实现定时刷新。

 使用说明:

  使用iframe标签实现定时刷新:
    优点是:不需要编写JavaScript代码,可以在浏览器禁用JavaScript的情况下实现定时刷新;
    缺点是:在某些不支持iframe标签的老式浏览器中没有效果,此外,iframe标签在浏览器中新增加了一个独立的页面,即使没有显示出来,不过其内部解析的window、document等对象仍然        存在,占用的浏览器内存相对较多。
 
  使用Image对象:
    优点是:与iframe相比,占用的内存相对较少,支持Image的浏览器也相对较多(现代浏览器均支持);
    缺点是:在浏览器禁用JavaScript的情况下就毫无用武之地了(这个现在几乎不存在,现在很少出现禁用js的情况)。
  
  Ajax来实现定时刷新:
    缺点是:因为有些老式浏览器的JavaScript无法实现Ajax,但是却可以使用Image对象。
        此外,使用Ajax需要编写更多的代码来处理XMLHttpRequest等对象的活动。

 

   

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 Spring Boot 整合 Shiro 进行开发时,可以通过配置 Shiro 的 session 过期时间来实现会话超时。具体实现步骤如下: 1. 在 Shiro 的配置文件中配置 session 过期时间: ```xml <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <!-- session 过期时间,单位毫秒 --> <property name="globalSessionTimeout" value="1800000"/> <!-- 是否开启删除无效的 session 对象 --> <property name="deleteInvalidSessions" value="true"/> </bean> ``` 2. 在 Spring Boot 的配置类中配置 Shiro 过滤器: ```java @Configuration public class ShiroConfig { @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); // 必须设置 SecurityManager shiroFilterFactoryBean.setSecurityManager(securityManager); // 配置登录的 url 和登录成功的 url shiroFilterFactoryBean.setLoginUrl("/login"); shiroFilterFactoryBean.setSuccessUrl("/index"); // 配置未授权跳转页面 shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 配置访问权限 LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); // 过滤链定义,从上向下顺序执行,一般将 /** 放在最为下边 // authc:所有 url 都必须认证通过才可以访问;anon:所有 url 都都可以匿名访问 filterChainDefinitionMap.put("/login", "anon"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/static/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/images/**", "anon"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } @Bean public DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm()); securityManager.setSessionManager(sessionManager()); return securityManager; } @Bean public UserRealm userRealm() { return new UserRealm(); } @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); // 设置 session 过期时间,单位毫秒 sessionManager.setGlobalSessionTimeout(1800000); // 删除无效的 session 对象 sessionManager.setDeleteInvalidSessions(true); return sessionManager; } } ``` 通过以上配置,可以在 Shiro 中实现 session 会话超时功能。在用户登录后,session 的过期时间会被设置为配置的时间,当用户在该时间内没有操作时,session 会话将被 Shiro 销毁,用户需要重新登录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值