Отключение кэша и хранение конфиденциальных данных формы в компонентах RequestScoped - PullRequest
0 голосов
/ 13 января 2020

Я изменяю приложение, чтобы оно перестало кэшироваться, используя для этого параметры контроля кэша в заголовках запросов. К сожалению, это приводило к сообщениям «Подтверждение повторной отправки формы» всякий раз, когда я отправляю форму и нажимаю кнопку «Назад», что является большим НЕТ ...

Я читал о повторной передаче формы и Post-Redirect-Get, но Я все еще борюсь с этим.

В большинстве случаев навигации у меня есть 2 страницы:

  • page1 содержит форму И (после отправки формы) результаты, это используется дважды.

  • на странице 2 показаны подробности результата, по которому щелкнул пользователь.

Объекты bean являются RequestScoped и выполняется переход со страницы 1 на страницу 2 например:

'' '

<h:dataTable value="#{page1.resultTable}">
    <h:column>
        <h:commandLink action="#{page2.getById(resultTable.id)}">
            <h:outputText value="#{resultTable.id}"/>
        </h:commandLink>
    </h:column>

   (...)

' ''

После использования PRG resultTable.id стал нулевым при загрузке страницы 2. Я решил это, используя Fla sh Scope, но проблема со страницей1 остается, когда возвращаешься со страницы 2.

Есть ли безопасный и элегантный способ сохранить данные страницы1 после посещения страницы2, сохраняя в Имейте в виду, что он содержит конфиденциальную информацию (финансовое приложение)?

Все страницы основаны на файле template.x html, который содержит кнопку возврата, и их соответствующие компоненты являются классами реализации templateInterface . Я подумал, что мог бы использовать «элегантное» решение, имея собственный код на кнопке «назад» в template.x html, который снова использовал бы Fla sh Scope для загрузки данных в ранее посещенный бин. Однако, как только я нажимаю кнопку «Назад», я немедленно получаю сообщение об отсутствии кэша.

Мне удалось автоматически обновить sh ранее посещенную страницу, включив js "window.history.replaceState (null, null, window.location.href) "но все данные формы теряются при этом ... Это лучшее решение?

РЕДАКТИРОВАТЬ:

page1 .x html выглядит так:

<?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>

Page1 bean:

@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;

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...