注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一线天色 天宇星辰

天下武功,唯快不破

 
 
 

日志

 
 

Sitemesh同步session问题解密  

2011-04-08 21:27:14|  分类: 软件开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Sitemesh是由一个基于Web页面布局、装饰及与现存Web应用整合的框架。它能帮助我们再由大量页面工程的项目中创建一致的页面布局和外观,如一致的导航条、一致的banner、一致的版权等。它不仅能处理动态的内容,如JSPPHPASPCGI等产生的内容,还能处理静态的内容,比如HTML的内容,使得它的内容也符合你的页面结构的要求。甚至它能像include那样将HTML文件作为一个面板的形式嵌入到别的文件中去。所有的这些,都是GOFDecorator模式的最生动的实现。装饰模式是在不必改变原类文件和使用集成的情况下,动态地扩展一个对象的功能。它能通过创建一个包装对象,也就是装饰来包裹的对象。

Sitemesh同步session问题解密 - 一线天色 天宇星辰 - 一线天色 天宇星辰

 

一般的网页格局都是这样子的

如上图所示:包含头部,左侧导航,底部和body体部分,而对于网站部分,一般头部,左侧导航栏和底部都是相对固定的,因此,采用Sitemesh作为网页装饰是很好的方案。如下图所示:

Sitemesh同步session问题解密 - 一线天色 天宇星辰 - 一线天色 天宇星辰
 

但是今天做蝌蚪支付平台遇到了一个很怪的问题,网站的头部记录了用户的一些基本信息和快速导航,如下图所示

Sitemesh同步session问题解密 - 一线天色 天宇星辰 - 一线天色 天宇星辰
 

我将页面分为几个部分,头部,左侧导航,body体,底部版权信息(如下)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<%@ page contentType="text/html;charset=UTF-8"%>

<%@ include file="/common/taglibs.jsp"%>

<html  xmlns="http://www.w3.org/1999/xhtml">

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <title><decorator:title/></title>

        <link rel="icon" href="${imageServer }/images/passport/swapy.ico" type="image/x-icon" />

        <link rel="shortcut icon" href="${imageServer }/images/passport/swapy.ico" type="image/x-icon" />

   <link href="${imageServer}/styles/swpay/user/public.css" rel="stylesheet" type="text/css" media="screen" />

   <link href="${imageServer}/styles/swpay/user/component.css" rel="stylesheet" type="text/css" media="screen" />

   <link href="${imageServer}/styles/swpay/user/password.css" rel="stylesheet" type="text/css" media="screen" />

   <link href="${imageServer}/styles/swpay/user/menu.css" rel="stylesheet" type="text/css" media="screen" />

        <script type="text/javascript" src="${appServer }/scripts/util/menu.js" ></script>

        <script type="text/javascript" src="${appServer }/scripts/util/jquery.js"></script>

        <script type="text/javascript" src="${appServer }/scripts/util/StringUtil.js"></script>

        <script type="text/javascript" src="${appServer }/scripts/front/common/setPayPasswordCommon.js"></script>

        <script type="text/javascript" src="${appServer }/scripts/front/jquery_ui/jquery-ui-1.7.custom.min.js"></script>

 

        <decorator:head/>

  </head>

<body <decorator:getProperty property="body.onload" writeEntireProperty="true"/>

<decorator:getProperty property="body.id" writeEntireProperty="true"/> >

<jsp:include page="/common/notice.jsp"></jsp:include>

<div class="wrapper" id="body_20100916133409">  

<jsp:include page="/common/headFront.jsp"></jsp:include>

    <div class="container">

       <jsp:include page="/common/leftFront.jsp"></jsp:include>

        <decorator:body/>

    </div>

    <jsp:include page="/common/footFront.jsp"></jsp:include>

</div>

<decorator:getProperty property="page.hiddening"/>

</body>

</html>

而在headFront.jsp即网页的头部回去读取对应的session信息,用于展示用户的一些基本信息。但是,今天做“退出”的功能,后台将对应的session清空,系统跳转至登录页面,但是网页的头部仍然为“登录”状态,但是点击其他链接,头部也马上成了未登录的状态。调试了很久,session都已经清空,但是页面上仍然能获取到session的信息,很奇怪!旁边一位牛人指点,你看下两个session是不是同一个?于是,我在访问页面和访问后台拦截器的时候去打印该session的值,结果竟然发现两个值竟然不一样!很神奇!仔细想了想才发现,原来是这样子的!

当访问一个请求的时候会经过Sitemesh的过滤器(当然只是你配置了的对应路径的请求)

    <filter>

       <filter-name>sitemesh</filter-name>

       <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>

    </filter>

当用户发起这个请求的时候,sitemesh会缓存用户的request信息并请求另外的资源,如上文提到的/common/headFront.jsp等这些资源,假设这时候你请求的用户“退出”的一个请求,在你嗲用退出这个方法之前,他便去请求对应的其他资源,此时session尚未清空,当然取的到数据,而你执行完退出方法之后,session被清空,返回的页面当然再去取session取不到,于是跳转至登录页,然后被刚才加在的装饰页一装饰,就会出现上面提到的问题,body的页面已经为session为空的登录页,而头部仍然为登录状态,然而再点击其他链接,由于session已经被清空,因此头部页面也变回了未登录的状态!于是,信息不同步的事情就发生了!

问题找到了,但是我们该如何解决这个问题呢?我们的目的是什么呢?我们的目的很简单,就是当主体类执行完后,sitemesh里面的session能够和主体的一致,于是退出时我采用了Ajax去清空session,然后js实现页面直接跳转到登录页,这样两次取session的时候session都已经不存在了!于是,问题解决!当然肯定会有更好的办法,或者sitemesh提供了什么设置延迟取session,我还没发现,那位仁兄发现了更好的方案共享下哦!

 你觉得本文对你有用吗?  

票数:35 投票时间:2011-04-08 21:27:15 到 2014-05-01 21:00:00

  •     33(100%)
  •     0(0%)
  •     0(0%)
  •     0(0%)
查看参与情况
编辑投票|删除投票

最新投票|博友投票

      评论这张
     
    阅读(63422)| 评论(2)
    推荐 转载

    历史上的今天

    评论

    <#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
     
     
     
     
     
     
     
     
     
     
     
     
     
     

    页脚

    网易公司版权所有 ©1997-2018