我正在使用JSF创建一个简单的Web应用程序。但是,我现在面临一个问题。 我的申请有两页。第一页有一个表单,第二页根据表单值进行一些处理。我在两个页面中都使用了视图范围的bean。 我没有使用缓存过滤器,所以当用户按下后退按钮,浏览器向服务器发送请求而不从缓存加载页面。此外,我正在使用PRG模式将数据从第1页发送到第2页。
问题:当我在第一页填写表单并按提交按钮时,如果发生某些验证错误,则第1页将按预期直接呈现。纠正错误后,当我再次按下按钮时,我转到第2页。但是现在如果我按下浏览器后退按钮第2页,我会得到错误缓存错误错误而不是第1页。
编辑:如果我在第一次尝试时正确提交表单并转到第2页然后按浏览器后退按钮,我将从服务器正确加载页面1。因此,当某个验证错误再次加载Page1然后转到第2页时会出现问题。
我理解问题的原因。原因是当由于验证错误而第二次加载页面1时,这是发布请求。所以第1页的源启动器现在是post请求。当我转到第2页并按下浏览器后退按钮时,浏览器发送第1页的发布请求而不是获取请求,因此发生了Cache Miss错误。 简而言之,浏览器正在检查第1页的来源是获取还是发布请求。如果page1上没有发生验证错误,那么第1页的来源是获取请求,当我按第2页上的后退按钮时,第1页正在加载正常。
AnyBody知道如何转换浏览器后退按钮请求从帖子中获取?
没有缓存过滤器我正在使用:
@WebFilter(servletNames = {"Faces Servlet"})
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
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.
// Clickjacking Protection
res.addHeader("X-FRAME-OPTIONS", "SAMEORIGIN");
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Do Nothing
}
@Override
public void destroy() {
// Do Nothing
}
}