在 JSF 导航后单击浏览器后退按钮会导致浏览器中出现 "Document expired"
Clicking browser back button after JSF navigation causes "Document expired" in browser
在我的项目中,登录页面后,如果我单击菜单,主页面会在左侧站点包含菜单 link 1 ==> 您将导航到第 1 页,然后单击菜单 link 2 = => 你将导航到第 2 页,如果你使用后退按钮,我会得到 文档过期.
我想在注销后删除浏览器缓存为此我使用阶段侦听器。
相位侦听器代码
@Override
public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
HttpServletResponse response = (HttpServletResponse) facesContext
.getExternalContext().getResponse();
logger.log(Level.INFO,"Cache control phase listener called");
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");
response.addHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "must-revalidate");
response.addHeader("Expires","Mon, 8 Aug 2006 10:00:00 GMT");
}
我还使用 UserFilter 来保护 /user/* 文件夹中的页面
这是 UserFilter 的 doFilter 代码
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
logger.log(Level.INFO,"User Filter's doFilter called");
UserManager userManager = (UserManager)((HttpServletRequest)request).getSession().getAttribute("userManager");
if(userManager==null || !userManager.getIsLoggedIn() || !userManager.getCurrentRole().equals("user")){
String contextPath = ((HttpServletRequest)request).getContextPath();
((HttpServletResponse)response).sendRedirect(contextPath+"/login.xhtml");
}else{
chain.doFilter(request, response);
}
}
我还希望登录后用户在注销之前无法再次返回登录页面。
if you use back button then i get "document expired"
如果之前的请求是同步 POST 请求(表单提交),就会发生这种情况。您不应该将 POST 用于 page-to-page 导航。为它使用 GET。
换句话说,用<h:link/button>
替换代表纯page-to-page导航links/buttons的<h:commandLink/Button>
。而且,当您需要在提交表单后导航到新页面时,例如要在提交条目后显示列表,请使用 POST-redirect-GET.
另请参阅:
- When should I use h:outputLink instead of h:commandLink?
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
- Is JSF 2.0 View Scope back-button safe?
- Avoid back button on JSF web application
与具体问题无关:PhaseListener
是处理 HTTP 响应 headers 的错误工具。使用正常 Filter
.
在我的项目中,登录页面后,如果我单击菜单,主页面会在左侧站点包含菜单 link 1 ==> 您将导航到第 1 页,然后单击菜单 link 2 = => 你将导航到第 2 页,如果你使用后退按钮,我会得到 文档过期.
我想在注销后删除浏览器缓存为此我使用阶段侦听器。
相位侦听器代码
@Override
public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
HttpServletResponse response = (HttpServletResponse) facesContext
.getExternalContext().getResponse();
logger.log(Level.INFO,"Cache control phase listener called");
response.addHeader("Pragma", "no-cache");
response.addHeader("Cache-Control", "no-cache");
response.addHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "must-revalidate");
response.addHeader("Expires","Mon, 8 Aug 2006 10:00:00 GMT");
}
我还使用 UserFilter 来保护 /user/* 文件夹中的页面
这是 UserFilter 的 doFilter 代码
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
logger.log(Level.INFO,"User Filter's doFilter called");
UserManager userManager = (UserManager)((HttpServletRequest)request).getSession().getAttribute("userManager");
if(userManager==null || !userManager.getIsLoggedIn() || !userManager.getCurrentRole().equals("user")){
String contextPath = ((HttpServletRequest)request).getContextPath();
((HttpServletResponse)response).sendRedirect(contextPath+"/login.xhtml");
}else{
chain.doFilter(request, response);
}
}
我还希望登录后用户在注销之前无法再次返回登录页面。
if you use back button then i get "document expired"
如果之前的请求是同步 POST 请求(表单提交),就会发生这种情况。您不应该将 POST 用于 page-to-page 导航。为它使用 GET。
换句话说,用<h:link/button>
替换代表纯page-to-page导航links/buttons的<h:commandLink/Button>
。而且,当您需要在提交表单后导航到新页面时,例如要在提交条目后显示列表,请使用 POST-redirect-GET.
另请参阅:
- When should I use h:outputLink instead of h:commandLink?
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
- Is JSF 2.0 View Scope back-button safe?
- Avoid back button on JSF web application
与具体问题无关:PhaseListener
是处理 HTTP 响应 headers 的错误工具。使用正常 Filter
.