Session丢失问题调试

本文探讨了IIS网站中常见的session丢失问题及其原因,包括sessiontimeout设置不当、应用程序池的异常重启及程序主动关闭session等情况,并提供了相应的排查方法。

有时候发现IIS网站经常session丢失,用户被迫重新登陆网站。造成这个问题的原因可能有这么几种

  • session timeout过短
  • 应用程序池回收
  • 程序调用主动关闭session

Session timeout

首先要确定这个网站是asp还是asp.net网站,IIS对于ASP和ASP.net的session配置在不同的地方。


对于ASP网站,session的控制在IIS Manager - Website Features - ASP - Services - Session Properties,通过这里的配置可以控制是否启用session,最大session数量以及session timeout时间等配置。
对于ASP.NET网站,session的控制在IIS Manager - Website Features - Session State,通过这里可以控制asp.net session相关的属性。

应用程序池回收

如果想判断是否是应用程序池重起造成的问题,可以通过IIS log或者Event Log来判断是否在发生问题的时间应用程序池发生过重起。


IIS log来判断的方式比较简单,

打开发生问题当天的IIS log,注意IIS log中记录的时间一般是UTC时间。如果IIS在某一时间发生过重起,那么log的头会重新写入,如下

#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2012-11-09 05:05:00
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken

通过Event log来判断需要打开IIS Recycle Event logging,链接如下
logEventOnRecycle
http://www.iis.net/configreference/system.applicationhost/applicationpools/add/recycling

打开之后应用程序池重起就会写入系统日志,直接查看系统日志即可。


应用程序池常规重起原因,

  • 管理员手动重起
  • 应用程序池根据配置的回收策略自动重起
  • 应用程序池空闲超时重起


应用程序池意外重起的原因多种多样,比如

  • Machine.Config, Web.Config or Global.asax are modified
  • The bin directory or its contents is modified
  • The number of re-compilations (aspx, ascx or asax) exceeds the limit specified by the <compilation numRecompilesBeforeAppRestart=/> setting in machine.config or web.config  (by default this is set to 15)
  • The physical path of the virtual directory is modified
  • The CAS policy is modified
  • The web service is restarted
  • (2.0 only) Application Sub-Directories are deleted (see Todd’s blog http://blogs.msdn.com/toddca/archive/2006/07/17/668412.aspx for more info)

程序调用主动关闭session

另外一种不太常见的可能性是程序本身调用了结束session的方法或者手动设置了一个不同的session timeout值,例如asp 的Session.Abandon方法或者asp.net中的HttpSessionState.Abandon方法。这种情况的调试方法可以通过在SessionStateModule.End时间中记录一些调用栈相关信息来判断是否有该问题发生。
### CAS单点登录中Session丢失的排查方法 在CAS单点登录系统中,Session丢失问题可能导致用户反复跳转认证,形成死循环。以下是详细的排查方法和解决方案。 #### 1. 检查浏览器Cookie设置 确保浏览器支持Cookie功能,并未禁用相关选项。如果Cookie被禁用,应用系统将无法保存Session信息,导致每次请求都被视为未登录状态[^2]。 #### 2. 验证Session超时时间配置 检查应用系统的Session超时时间是否合理。过短的超时时间可能频繁触发Session失效,进而导致认证失败。可以通过以下代码示例调整Tomcat中的Session超时时间: ```xml <session-config> <session-timeout>30</session-timeout> <!-- 单位为分钟 --> </session-config> ``` 此外,确认是否在退出逻辑中正确清空了Session数据[^1]。 #### 3. 确认Session共享机制 在分布式部署环境中,多个节点之间需要共享Session信息。如果使用的是基于内存的Session存储方式(如默认的JSESSIONID),可能会因为负载均衡器的随机分配导致Session丢失。建议采用以下方法解决: - 使用粘性会话(Session Affinity)确保同一用户的请求始终路由到同一服务器。 - 将Session数据存储到集中式缓存中(如Redis或Memcached),以实现跨节点的Session共享。 #### 4. 检查Cookie Path与Domain配置 错误的Cookie Path或Domain设置可能导致Session无法正确识别。例如,Tomcat默认将JSESSIONID的Path设置为应用路径,而前端页面可能期望根路径`/`下的Cookie。这种不匹配会导致Session丢失。可以通过手动设置Cookie Path来解决此问题[^3]。 以下是一个Java代码示例,展示如何手动设置JSESSIONID的Path为根路径: ```java import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; public class SessionManager { public static void setSessionCookie(HttpServletResponse response, String sessionId) { Cookie cookie = new Cookie("JSESSIONID", sessionId); cookie.setPath("/"); // 设置Cookie Path为根路径 cookie.setHttpOnly(true); // 增强安全性 response.addCookie(cookie); } } ``` #### 5. 调试日志分析 启用调试日志以捕获Session管理相关的详细信息。通过日志可以确认以下内容: - 用户是否成功登录并生成了Session。 - Session ID是否在每次请求中正确传递。 - 是否存在异常导致Session被销毁。 可以在Spring框架中配置如下日志级别以获取更多细节: ```properties logging.level.org.springframework.security=DEBUG logging.level.org.jasig.cas.client=DEBUG ``` #### 6. 检查SSL配置 如果CAS服务器或应用系统未正确配置SSL,可能会导致Session信息在传输过程中丢失。确保所有涉及敏感数据的通信均通过HTTPS进行,并验证SSL证书的有效性[^5]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值