首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

Spring Security与BlazeDS集成的FlexSession Invalid有关问题

2012-08-27 
Spring Security与BlazeDS集成的FlexSession Invalid问题??????? 先说现象:当用户登录以后,如果点击浏览器

Spring Security与BlazeDS集成的FlexSession Invalid问题

??????? 先说现象:当用户登录以后,如果点击浏览器的后退按钮回到登录页面,这个时候用浏览器的前进按钮是可以再回到主页面的,但如果再想通过输入用户名/密码登录的时候,就会发现登录不了,系统会一直跳转到登录页面。查看后台的话会发现这个是因FlexSession invalid Exception 引起的。
?????? 仔细想想觉得系统不应该会有这种bug啊,但是不管你觉得会不会,问题出现了,而且还非常容易重现。先查了下blazeds的jira,还真发现有人提过这个bug(http://bugs.adobe.com/jira/browse/BLZ-350),但是看这个issue的comments说考虑会在版本4中改,又说在spring security中改更容易,还给了一个spring security jira的连接。


?????? 果然,spring security jira中也有人提过这个bug(https://jira.springsource.org/browse/SEC-1109),看了下解决方案是通过实现自己的SessionAuthenticationStrategy在销毁/复制旧session的时候特殊处理“__flexSession”属性。
?????? 也就是说双方都没改,只是提供了修复建议,默认配置还是会出现这个bug,有点意思,呵呵!那就查看下source code,自己探其究竟吧:

?????? 先说blazeds,他提供了一个叫做HttpFlexSession的session监听器,他会去监听HttpSession,从而维护了一套与HttpSession对应的属性,而它自己也会作为HttpSession的__flexSession属性存在。


Spring Security与BlazeDS集成的FlexSession Invalid有关问题

?????? 当HttpSession销毁的时候,HttpFlexSession的sessionDestory方法触发,该方法会清理HttpFlexSession所占的资源,从而使得其自身invalidate(),即当前的这个HttpFlexSession已经不可用了,但是他并不会将自己从HttpSession中清理掉,也没有将自己设置为null。参考代码:


?



?????? 从Spring Security角度看,这个也没有错啊!已经认证过的用户再次认证,我的策略就是复制一个新的session。这也难怪双方都没有去改框架的代码。

?????? 正如JIRA上的建议,也从源码可看到在SessionManagementFilter中,SessionAuthenticationStrategy是可以自己配置的:

@Overridepublic void service(HttpServletRequest req, HttpServletResponse res) {HttpSession httpSession = req.getSession(true);HttpFlexSession flexSession = (HttpFlexSession)httpSession.getAttribute(XXWebServlet.SESSION_ATTRIBUTE);if( flexSession != null && !flexSession.isValid()){httpSession.removeAttribute(XXWebServlet.SESSION_ATTRIBUTE);}super.service(req, res);}

?

热点排行