我们正在使用:
我们有mainForm.jsp
,filterForm.jsp
和externalForm.jsp
意见。
上有一个按钮“过滤器”,mainForm.jsp
可转换为filterForm.jsp
。它通过导航规则来做到这一点:
<h:commandButton value="Filter" action="#{mainBean.filterData}" />
该mainBean.java
代码是:
public String filterData() {
doStuff();
return "filter";
}
最初可以正确转换为filterForm.jsp
。我们可以mainForm.jsp
使用浏览器后退按钮返回。我们可以重复执行此操作。
上面mainForm.jsp
有一个表格(实际上是ILog
Gantt图表,但我们认为没有关系),图表栏上带有“弹出”菜单。菜单选项之一是重定向到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);
}
这可以正常工作。窗口切换到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
浏览器后退按钮从浏览器缓存中请求结果页面。它不要求服务器重新创建新页面。在您的特定情况下,很可能缓存的页面包含当前无效的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);
}
将此映射<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>
问题内容: 我正在编写一个Web应用程序,该应用程序使用AJAX检索大量数据,该AJAX基本上根据用户单击的按钮修改了加载的页面(假设单击button1会将页面从state0转到state1,依此类推。) 此外,如果将按钮号作为GET变量传递给服务器,则服务器将返回正确状态的页面。 不用说,后退/前进浏览器按钮不起作用,因为在通过AJAX完成状态更改期间URL不会更改。 所以,我的问题是,如何使浏
问题内容: 在我的AngularJS应用程序中,当用户未登录时,我将重定向到特定页面。为此,我在上使用了一个变量。 现在,我想在用户登录时阻止浏览器的后退按钮。我想将其重定向到特定页面(视图)。问题是我不知道是否有 后退按钮事件 。 我的代码是: 因此,我将编写一个伪代码,例如: 可能吗? 一个幼稚的解决方案是编写一个函数,该函数检查和的顺序是否错误,并检测用户是否 返回 。 还有其他解决方案吗?
问题内容: 我在www.darknovagames.com上运行了基于浏览器的游戏。最近,我一直在努力使用CSS重新格式化该网站,试图让其所有页面都根据HTML标准进行验证。 我一直在想着要在页面左侧放置AJAX导航菜单的想法(而不是每次都将用户带到一个单独的页面,而是需要重新加载标题和导航栏,而这几乎是不会改变的),我知道如果这样做,我可能会破坏浏览器中的“前进/后退”按钮。我的问题是,我应该继
问题内容: 如何禁用浏览器的“后退”按钮(跨浏览器)? 问题答案: 这个问题是非常相似,这一个 … 您需要强制缓存过期才能正常工作。将以下代码放在页面代码后面。
问题内容: 我正在用php做在线测验应用程序。我想限制用户再次参加考试。我尝试了以下脚本,但是它停止了我的计时器。我该怎么办? 我已经包含了源代码。计时器存储在cdtimer.js中 我有一个考试计时器,该计时器从 mysql 值中获取考试时间。计时器相应地启动,但是当我放入用于禁用后退按钮的代码时,计时器停止。我怎么了 问题答案: 有许多原因导致禁用后退按钮无法真正起作用。最好的选择是警告用户:
问题内容: 想要禁用网站的后退按钮 只要该人单击浏览器的“后退”按钮,它就不能进入他之前访问的页面。 问题答案: 该脚本将覆盖尝试以当前页面的状态来回导航。 更新: 一些用户报告说,使用document.URL而不是可以取得更好的成功document.title:
本文向大家介绍如何禁止浏览器使用后退按钮功能,包括了如何禁止浏览器使用后退按钮功能的使用技巧和注意事项,需要的朋友参考一下 本文介绍可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适用场合。 一、概述 曾经有许多人问起,“怎样才能‘禁用'浏览器的后退按钮?”,或者“怎样才能防止用户点击后退按钮返回以前浏览过的页面?”在ASP论坛上,这个问题也是问得最多的问题之一。遗憾的是,答案非常
问题内容: 使用Javascript或AngularJS控制或禁用浏览器后退按钮 在这里我不是在问一个问题,但我想展示一个解决方案,以解决您使用AngularJS甚至Javascript时如何禁用和控制浏览器的后退按钮 问题答案: 如果您仅使用Javascript,则可以通过以下链接检查如何禁用“后退按钮”: http://jordanhollinger.com/2012/06/08/disabl