项目中使用SiteMesh2.4.1,
在web.xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <filter>
   <filter-name>redirectFilter</filter-name>
   <filter-class>com.web.MyFilter</filter-class>
  </filter>
  <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>redirectFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <session-config>
    <session-timeout>120</session-timeout>
  </session-config>
</web-app>
其中,redirectFilter是我的测试Filter。在主页面中因部分页面存储全局变量而不能刷新,故在SiteMesh的主页面中采用iframe,点击菜单后,执行:top.workspace.location.href=“/XXX.jsp”(workspace是iframe的name)
于是问题出现了:
页面被装载布局后,redirectFilter的doFilter被执行两次(经测试,如果主页含N个iframe,则执行N+1次)。
如下情况则不会出现上述问题:
1. 页面中不要使用iframe,则不会有问题(可是实际情况要求必须在页面中有一个区域不能被刷新,故此方法行不通)。
2. 在web.xml中,不要配置sitemesh的filter-mapping,则不会出现此问题(此中解决则不能使用sitemesh,也非吾愿,)。查阅许多资料,仍然无解,现在看最现实的选择是将sitemesh换为Struts Tiles,但Struts Tiles也有自身的问题,相对而言sitemesh更符合大型项目的商业实施要求。恳请各位大虾予以帮助。谢谢!

解决方案 »

  1.   

    补充一下,redirectFilter代码如下:package com.web;import java.io.IOException;import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;public class MyFilter implements Filter { public void destroy() {
    // TODO Auto-generated method stub
    System.out.println("destroy filter");

    } public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {
    System.out.println("doFilter filter");
    chain.doFilter(request, response);
    // TODO Auto-generated method stub

    } public void init(FilterConfig filterConfig) throws ServletException {
    // TODO Auto-generated method stub
    System.out.println("init filter");
    }
    }
      

  2.   

    在filter把2次请求的路径输出来,是重复的还是不同的请求?
      

  3.   

    那你可以过滤掉不需要修饰的页面呀。
    <?xml version="1.0" encoding="ISO-8859-1"?>
        <decorators defaultdir="/decorators">
        <!-- Any urls that are excluded will never be decorated by Sitemesh -->
        <excludes>
            <pattern>这里是过滤的路径(文件)</pattern>
        </excludes>    <decorator name="main" page="main.jsp">
            <pattern>/jsp/busicore/*.jsp</pattern>
            <pattern>/jsp/busicore/*.do</pattern>
        </decorator>
    </decorators>