我们正在使用:
我们有mainForm.jsp
,filterForm.jsp
和externalForm.jsp
意见.
有一个按钮"过滤器"打开mainForm.jsp
过渡到filterForm.jsp
.它通过导航规则执行此操作:
<h:commandButton value="Filter" action="#{mainBean.filterData}" />
Run Code Online (Sandbox Code Playgroud)
该mainBean.java
代码是:
public String filterData() {
doStuff();
return "filter";
}
Run Code Online (Sandbox Code Playgroud)
这最初正确地转换为filterForm.jsp
.我们可以回到mainForm.jsp
浏览器后退按钮.我们可以反复这样做.
在mainForm.jsp
我们有一个表(实际上是一个ILog的甘特图,但我们不认为事项),与上图巴的"弹出"菜单.其中一个菜单选项是重定向到externalForm.jsp
.
选择"重定向"会触发以下方法mainBean.java
:
public void redirect(FacesMenuActionEvent event) {
if (svr == null) {
svr = new SetupURL(); // Simple code to set up the full URL
}
redirectUrl = svr.redirect(event); // URL of externalForm.jsp
svr.redirectData(redirectUrl);
}
Run Code Online (Sandbox Code Playgroud)
这是正确的.窗口转换为externalForm.jsp
.
如果我们按下浏览器后退按钮externalForm.jsp
,我们会转换回来,mainForm.jsp
看起来不错.
如果我们然后按"过滤器"按钮,代码不会执行该filterData()
方法,而是执行该redirect()
方法,我们转换到externalForm.jsp
视图,而不是filterForm.jsp
视图.
为什么会这样做?我们如何强制拨打电话filterData()
呢?
******************************************************************************
BalusC - thank you for your solution. With a few slight tweeks, it worked great.
The changes I made to web.xml are:
<filter>
<filter-name>noCacheFilter</filter-name>
<filter-class>{my package name}.CacheControlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>noCacheFilter</filter-name>
<url-pattern>/faces/*</url-pattern>
</filter-mapping>
Also, I found another solution:
faces-config.xml add:
<lifecycle>
<phase-listener id="nocache">{my package name}.
CacheControlPhaseListener</phase-listener>
</lifecycle>
Create file CacheControlPhaseListener.java:
package {my package name};
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletResponse;
public class CacheControlPhaseListener implements PhaseListener {
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
public void afterPhase(PhaseEvent event) {
}
public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
HttpServletResponse response = (HttpServletResponse) facesContext
.getExternalContext().getResponse();
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");
// Stronger according to blog comment below that references HTTP spec
response.addHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "must-revalidate");
// some date in the past
response.addHeader("Expires", "Mon, 8 Aug 2006 10:00:00 GMT");
}
}
Both seem to work.
Thanks,
John
Run Code Online (Sandbox Code Playgroud)
Bal*_*usC 10
浏览器后退按钮从浏览器缓存中请求结果页面.它不会从服务器请求新的新页面.在您的特定情况下,缓存页面很可能包含当前无效的JSF视图状态.
最好的解决方法是指示浏览器不缓存动态JSF页面,而是每次都直接从服务器请求它.你可以Filter
在doFilter()
方法的帮助下做到这一点:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletResponse res = (HttpServletResponse) response;
res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
res.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);
}
Run Code Online (Sandbox Code Playgroud)
此地图在同一<servlet-name>
中的FacesServlet
在web.xml
.例如
<filter>
<filter-name>noCacheFilter</filter-name>
<filter-class>com.example.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>noCacheFilter</filter-name>
<servlet-name>facesServlet</servlet-name>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5388 次 |
最近记录: |