Jsf 处理后退按钮和生成的阶段ID

Jsf 处理后退按钮和生成的阶段ID,jsf,jsf-2,Jsf,Jsf 2,我的情况如下: JSF(MyFaces 2.1.7和RichFaces 3.3.3) 会话范围的Bean测试页面 将使用“后退”按钮到终点的用户 服务器上的状态保存 情景: 用户单击链接导航到具有会话范围bean的页面(测试页面) 用户单击另一个链接 用户按下brwoser的“后退”按钮,将其放回测试页面 用户尝试在此页面中搜索 在搜索时,支持bean抛出异常,因为存在许多null值。原因是当他们按下“搜索”时,页面处于RESTORE\u VIEW阶段 我曾尝试禁用页面缓存,强迫用户在“后退

我的情况如下:

  • JSF(MyFaces 2.1.7和RichFaces 3.3.3)
  • 会话范围的Bean测试页面
  • 将使用“后退”按钮到终点的用户
  • 服务器上的状态保存
  • 情景:

    • 用户单击链接导航到具有会话范围bean的页面(测试页面)
    • 用户单击另一个链接
    • 用户按下brwoser的“后退”按钮,将其放回测试页面
    • 用户尝试在此页面中搜索
    在搜索时,支持bean抛出异常,因为存在许多
    null
    值。原因是当他们按下“搜索”时,页面处于
    RESTORE\u VIEW
    阶段

    我曾尝试禁用页面缓存,强迫用户在“后退”按钮上刷新页面,但由于许多用户抱怨“为什么我不能使用后退按钮,我以前可以这么做!”而引起强烈反弹,并导致求助台收到通知单,因为他们认为应用程序在“确认表单重新提交”页面chrome/IE/Firefox上崩溃,因此,经理们希望我寻找替代方案

    我的问题是:

    可以检测RESTORE_VIEW的当前阶段ID,而不在此阶段进行任何处理以避免异常,但仅通过重新调整即可为用户提供部分页面视图。在这种情况下,是否可以将页面置于
    RENDER\u RESPONSE
    中,然后进行处理?这将刷新页面

    问题第2部分 由于建议(或通用/良好)做法是禁用动态页面上的缓存,因此我已经这样做了,并将不得不重新教育顽固的用户

    然而,我有以下问题

    在禁用缓存的页面上按后退按钮时,浏览器显示“确认表单重新提交”(chrome),用户可以按
    Refresh/F5
    Enter

    如果操作是
    Refresh/F5
    ,则在检测
    RESTORE\u VIEW
    阶段时一切正常,避免在该阶段进行任何处理,并让处理在
    RENDER\u RESPONSE
    阶段完成。但是,如果按下Enter键,则PhaseID处于RENDER_RESPONSE(6)中,但少数下拉控件的值为null,从而导致页面失败。因此,我通过检查来检测这种情况,并显示一条FaceMessage来告诉用户刷新页面

    问题是,我是否可以强制页面刷新,而不是强制用户刷新?此页面的导航案例的格式为:

         <navigation-rule>
          <navigation-case>
           <from-outcome>/app/ord/r1</from-outcome>
           <to-view-id>/jsp/ordersHistory.jsp</to-view-id>
          </navigation-case>
         </navigation-rule>
    
    
    /app/ord/r1
    /jsp/ordersHistory.jsp
    

    我在网上看到过一些代码片段,其中
    faces redirect=true
    用于强制重新加载页面,但我无法让它工作!有什么建议吗?

    在动态页面上禁用浏览器缓存是一种方法

    至于此后出现的新问题,很可能是由于webapp设计不好造成的。重新设计您的Web应用程序,以使用GET而不是POST进行普通的页到页导航(即仅使用
    而不是
    )。为需要将响应发送到不同页面的POST请求实现POST Redirect GET模式,或者将它们更改为返回到同一页面并有条件地显示结果(如果可能的话,通过ajax)。检查是否有些表单最好是GET表单(例如,像Google这样的搜索表单)。重新考虑一下,如果该bean真的需要是会话范围的bean,那么您通常只将会话范围用于登录用户及其首选项,而不用于请求或查看范围的数据

    另见:

    禁用动态页面上的浏览器缓存是一种方法

    至于此后出现的新问题,很可能是由于webapp设计不好造成的。重新设计您的Web应用程序,以使用GET而不是POST进行普通的页到页导航(即仅使用
    而不是
    )。为需要将响应发送到不同页面的POST请求实现POST Redirect GET模式,或者将它们更改为返回到同一页面并有条件地显示结果(如果可能的话,通过ajax)。检查是否有些表单最好是GET表单(例如,像Google这样的搜索表单)。重新考虑一下,如果该bean真的需要是会话范围的bean,那么您通常只将会话范围用于登录用户及其首选项,而不用于请求或查看范围的数据

    另见:

    感谢您的评论。我将禁用动态页面的缓存,否则结果是不可预测的。我更新了问题并添加了相关的第2部分。您可以发表意见吗?请参阅“如何避免在刷新页面时重新执行上次表单提交操作?”链接中的答案。添加
    。感谢您的评论。我将禁用动态页面的缓存,否则结果是不可预测的。我更新了问题并添加了相关的第2部分。您可以发表意见吗?请参阅“如何避免在刷新页面时重新执行上次表单提交操作?”链接中的答案。添加一个