0

我想使用 Scope 拦截器在我的 Struts2(2.2.3.1) 应用程序中实现类似向导的功能。

我的 struts.xml 文件如下:

<action name="actionA class="classA" method="methodA">
    <interceptor-ref name="basicStack" />   
    <interceptor-ref name="scope">
        <param name="session">stringA</param>
        <param name="key">consultGuides</param>
        <param name="type">start</param>
    </interceptor-ref>      
    <result>/resultA.jsp</result>
</action>
<action name="actionB" class="classA" method="methodB">
    <interceptor-ref name="scope">
        <param name="session">stringA, listA</param>
        <param name="key">consultGuides</param>
        </interceptor-ref>
        <interceptor-ref name="basicStack" />               
        <result>/resultB.jsp</result>
</action>
    ....
    ....

“resultA.jsp”提交给填充“listA”的“actionB”。但是现在如果我按下后退按钮(到达 resultA.jsp,其中 resultA.jsp 只是从其缓存加载到浏览器而不向服务器发出新请求)并对列表进行任何更改,新条目将附加到“listA”而不是完全替换它。

修改“listA”的“resultA.jsp”中的代码是

<s:iterator value="listB"   status="statusB">
    <li>
        <a title="%{varA}">
            <s:checkbox name="listA.id" fieldValue="%{varB}" />
        </a>
    </li>
</s:iterator>

我没有实现 SessionAware,只是依靠 scopeInterceptor 将 listA 提供给会话。

如何让它用请求中的新列表替换“listA”?

4

1 回答 1

0

为了在单击浏览器的后退或前进按钮后不允许缓存页面,您可以尝试在 http 响应中添加一些标头,这将在您每次单击后退或前进按钮时清除缓存。

如果您在拦截器中添加它,这将非常有效。

response.setHeader("Cache-Control", "no-cache, no-store"); //HTTP 1.1
response.setHeader("Pragma", "no-cache"); //HTTP 1.0
response.setDateHeader("Expires", 0); //prevents caching at the proxy server   

通过这样做,按下后退按钮将不会加载缓存页面,但会向服务器发出新请求。这应该可以解决您的问题。

于 2012-08-24T18:22:34.527 回答