Session过期、失效时间

       Session一直是我们做web项目经常使用的,以前没太注意,这次又细致的看了下!

  1.session其实就是一个Map,键=值对,通过session.getAttribute("name");获得session中设置的参数

  2.session的过期时间是从什么时候开始计算的?是从一登录就开始计算还是说从停止活动开始计算?

  答:从session不活动的时候开始计算,如果session一直活动,session就总不会过期。

  从该Session未被访问,开始计时; 一旦Session被访问,计时清0;

  3.设置session的失效时间

  a)web.xml中

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

  b)在程序中手动设置

  session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期

  c)tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:

  <Context path="/livsorder" docBase="/home/httpd/html/livsorder"   defaultSessionTimeOut="3600" isWARExpanded="true"   isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

  4.如何判断session过没过期

  1.以前是根据 if(session.getAttribute('user')==null)判断是否为空

  =========================================================================================

  2.如下为看到的一个帖子,判断session不为空的好方法:

  request.getSeesion(boolean)方法,一下子让我恍然大悟。这个方法里面传了一个boolean值,这个值如果是true,那么如果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在request的当前会话不存在的时候就返回null。
这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以“近似地”认为session不存在就是session过期了,那么我们就可以很容易地判断session是否过期了。方法如下:

  if(request.getSession(false)==null)
System.out.println("Session has been invalidated!");
else
System.out.println("Session is active!");

  可能大家注意到我上面有一个“近似地”字眼,也就是说存在特别情况。
这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null,原因我想大家应该是显然的。

也有很多人觉得应该使用javax.servlet.http.HttpSessionBindingListener接口来实现类似功能。
他们的意思是当session创建的时候session.setAttribute("isActive","yes");只要session没有过期,那么我们就可以session.getAttribute("isActive")==null来判断,但是我们如果在过期以后就不能用这个办法了,因为我们使用过期的session.getAttribute()方法就会抛出java.lang.IllegalStateException,这时候我们就只能通过捕捉这个异常来进行判断,这就会打乱我们整个程序的逻辑流程。
当然我们也可以在session过期的时候这样处理,在HttpSessionBindingListener接口的onValueUnbound()方法里面通过设置一个flag来标志session已过期,之后盘都都使用这个flag,那么这个flag一定是要放在application里面,application是HttpServletContex类的对象,所以我们必须对这个flag加入是哪个session过期的信息,这样一来整个的过程就十分麻烦。
关于用监听器实现我要补充一点,我的方法是站在某一个session的角度来实现的。如果说要监测多个session就应该站在application的角度来分析,这时候的最佳选择就是HttpSessionBindingListener或者HttpSessionListener
写这个帖子的目的就是让大家在需要判断的时候(不管session是否过期都OK)用这样的一条语句来简单的实现功能,至于意义我们姑且不谈。


### 负载均衡环境下CAS技术中Session过期失效问题的解决方案 在负载均衡环境中部署CAS(Central Authentication Service),可能会遇到Session过期失效的问题。这通常是由于分布式架构下各节点之间的Session共享机制不一致所引起的。以下是几种常见的解决方案及其具体实施方式: #### 1. **集中存储Session** 集中式Session管理能够有效解决负载均衡环境下的Session同步问题。推荐采用Redis或其他高性能缓存数据库作为统一的数据源来保存用户的Session信息[^1]。 实现步骤如下: - 安装并配置Redis服务器; - 修改CAS Server代码,使其支持将Session写入到外部存储而非本地内存; - 更新Spring Boot项目依赖项以集成spring-session-data-redis库; 示例Maven POM文件摘录: ```xml <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> ``` #### 2. **调整Ticket Timeout Policy** 若发现即使启用了Remember Me功能仍然频繁遭遇Session丢失状况,则需进一步审视Ticket的相关超时策略是否恰当匹配业务需求。适当延长TGT(Service Ticket)的有效期限有助于缓解此类矛盾冲突情形[^3]。 下面给出一段Java代码用于定制化的Ticket Expiration Policies定义: ```java @Configuration public class CustomTicketExpirationPolicies { @Bean public ITicketExpirationPolicy ticketGrantingTicketExpirationPolicy(){ return new MultiTimeUseOrTimeoutExpirationPolicy(7200, Integer.MAX_VALUE); } @Bean public ITicketExpirationPolicy serviceTicketExpirationPolicy(){ return new UsesBeforeExpiryExpirationPolicy(10); } } ``` #### 3. **粘性会话 Sticky Session** 另一种简易可行的办法便是利用反向代理设备提供的Sticky Sessions特性保障同一客户端始终路由至固定的后端实例完成整个事务流程处理过程。不过这种方法存在一定局限性——一旦目标机器发生故障切换则依旧无法规避潜在风险隐患[^4]。 Nginx配置样例展示如何激活sticky模块: ```nginx upstream cas_servers { ip_hash; # 或者使用其他hash算法代替ip_hash达成类似效果 server 192.168.1.101:8443; server 192.168.1.102:8443; } server { listen 443 ssl; location /cas/ { proxy_pass https://cas_servers/; } } ``` #### 4. **增强日志记录与监控能力** 增强系统的可观测性和诊断效率对于快速定位异常根源至关重要。借助ELK Stack(Apache Logstash+Elasticsearch+Kibana)组合搭建实时日志采集平台可以帮助运维人员及时捕捉任何可疑迹象进而采取针对性补救举措[^5]。 --- ### 总结 综合来看,在负载均衡条件下妥善处置CAS相关的Session过期失效难题需要从多个维度展开工作:一方面要确保跨不同物理位置间的一致性维护良好体验品质;另一方面也要兼顾性能考量避免不必要的资源浪费。以上列举了几种典型的技术路线供参考选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值