Https 禁用缓存并在RequestScoped bean中保留敏感表单数据

Https 禁用缓存并在RequestScoped bean中保留敏感表单数据,https,jsf-2.2,Https,Jsf 2.2,我正在更改一个应用程序,使其停止被缓存,使用缓存控制参数对请求的头进行缓存以实现这一点。不幸的是,每当我提交表单并按下后退按钮时,就会出现“确认表单重新提交”的消息,这是一个很大的错误 我一直在读关于表单重新提交和后重定向获取的文章,但我仍然在努力解决这个问题 在大多数导航情况下,我有两个页面: page1包含表单和(提交表单后)结果,它被使用了两次 第2页显示用户单击的结果的详细信息 bean是RequestScope的,从page1到page2的导航如下: ''' 您应该编辑您的问题,并

我正在更改一个应用程序,使其停止被缓存,使用缓存控制参数对请求的头进行缓存以实现这一点。不幸的是,每当我提交表单并按下后退按钮时,就会出现“确认表单重新提交”的消息,这是一个很大的错误

我一直在读关于表单重新提交和后重定向获取的文章,但我仍然在努力解决这个问题

在大多数导航情况下,我有两个页面:

  • page1包含表单和(提交表单后)结果,它被使用了两次

  • 第2页显示用户单击的结果的详细信息

bean是RequestScope的,从page1到page2的导航如下:

'''


您应该编辑您的问题,并尝试添加一个,然后将错误消息复制粘贴到问题中。例如,我不知道“丢失的缓存消息”,归根结底就是停止使用POST进行页到页导航。从技术上讲,这是你的复制品:@Selaron这个应用程序非常庞大,很难提供一个清晰的例子,但如果仍然需要,我会亲自动手!使用ajax请求而不是完整请求。将
添加到命令按钮。在
@requestscope
@SessionScoped
之间有
@ViewScoped
和DeltaSpike(CDI扩展名)之间有一个
@ViewAccessScope
,它位于会话和视图之间,更易于作为
@ConversationScope
使用,因此如果您真的可以制作一个,我非常乐意帮助调查,因为我也想自己做这一步。通过url参数导航到第一页是我认为你仍然需要的。
<h:dataTable value="#{page1.resultTable}">
    <h:column>
        <h:commandLink action="#{page2.getById(resultTable.id)}">
            <h:outputText value="#{resultTable.id}"/>
        </h:commandLink>
    </h:column>

   (...)
<?xml version='1.0' encoding='UTF-8' ?>
<ui:composition xmlns:f="http://java.sun.com/jsf/core"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                template="/WEB-INF/templates/transaction-template.xhtml"
                xmlns:t="http://myfaces.apache.org/tomahawk"
                xmlns:c="http://java.sun.com/jsp/jstl/core"
                xmlns:components="http://java.sun.com/jsf/composite/components">

    <ui:define name="mainContent">
        <h:form id="form">
            <h:inputHidden id="_itemId" value="#{listItem.itemId}" />

            <fieldset class="fieldsetTransaction">
                <table class="formTransaction">
                    <tr>
                        <td class="labelsCol">
                            <h:outputText value="#{labels.itemId}" />
                        </td>                        
                        <td class="valuesCol">
                             <h:inputText value="#{listItem.itemId}" />
                        </td>
                    </tr>
                    <tr>
                        <td class="labelsCol">
                            <h:outputText value="#{labels.itemName}" />
                        </td>
                        <td class="valuesCol">
                             <h:inputText value="#{listItem.itemName}" />
                        </td>
                    </tr>
                    <tr class="formActions">
                        <td colspan="4">
                            <h:commandButton value="#{labels.search}"
                                                 title="#{labels.search}"
                                                 type="submit"
                                                 id="search"
                                                 action="#{listItem.list()}"
                                                 styleClass="default formButton">
                                <f:ajax execute="@form" render="resultPanel"/>
                            </h:commandButton>
                        </td>
                    </tr>
                </table>
            </fieldset>

            <h:panelGroup id="resultPanel">
            <fieldset class="fieldsetTransaction">

                <h:dataTable value="#{listItem.listReply.itemList}"
                             cellpadding="1" id="itemList_"
                             border="0" width="100%" columnClasses="c, l, c, l"
                             rowClasses="odd, even"
                             styleClass="list" var="itemList" cellspacing="1"
                             rendered="#{not empty listItem.listReply.itemList}">
                    <h:column>
                        <f:facet name="header">
                            <h:outputText value="#{labels.itemId}" />
                        </f:facet>
                        <h:commandLink action="#{editItem.getById(itemList.itemId)}"
                                       id="searchItemLink"
                                       title="#{menu['search.item']}">
                            <h:outputText value="#{itemList.itemId}" />
                        </h:commandLink>

                         <!-- new working code -->
                        <h:link action="#{editItem.getById(itemList.itemId)}"
                                       id="searchItemLink_"
                                       title="#{menu['search.item']}">
                            <h:outputText value="#{itemList.itemId}" />
                            <f:param name = "itemId" value"#{editItem.itemId}" />
                        </h:link>
                    </h:column>
                </h:dataTable>
            </fieldset>
            </h:panelGroup>

            <t:saveState value="#{listItem.listReply}" />
        </h:form>
    </ui:define>

    <ui:define name="filename">
        item\itemManagement\list_items.xhtml
    </ui:define>
</ui:composition>
@Named("listItem")
@RequestScoped
public class ListItemIdsBean extends AbstractBean {

    private BigInteger itemId;
    private String itemName;

    // dummy code, just to represent irrelevant business logic that returns a list of items
    private ExtAppListReply listReply;

    public BigInteger getItemId() {
        return itemId;
    }

    public void setItemId(BigInteger itemId) {
        this.itemId = itemId;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public ExtAppListReply getExtAppTransaction() {
        if( listReply == null ) {
            listReply = new ExtAppListReply();
        }
        return listReply;
    }

    public void setExtAppTransaction(ExtAppListReply trx) {
        this.trx = trx;
    }

    private void list(BigInteger itemId, String itemName) {

        ExtAppTransaction trx = ExtAppTransactionFeeder.feeder(this, itemId, itemName);
        ExtAppListReply listReply = super.executeTransaction(trx);

        if( listReply != null && !listReply.isSetRefusalCode() ) {
            setExtAppTransaction(listReply);
        } else {
            if( !(type == BACKWARD || type == FORWARD)  ) {
                setExtAppTransaction(null);
            }
        }

        // show results in the same page
        return null;

    }

}