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