jjr*_*oss 6 jsf redirect jsf-2
我有一个关于面部导航的问题.
所以我有一个页面,它接受一个请求参数来加载特定用户.此页面显示commandLink列表,单击该列表时,使用隐式导航重定向到另一个页面.通过调用"preRenderView"中的方法来加载用户.
我们重定向到的页面还会获取一个请求参数来确定要加载的大小写.该页面还使用了preRenderView.
两个页面都有视图作用域的bean.
对于按下的FIRST链接,这一切都很棒.第一页重定向到新URL,案例按预期加载.
但是,如果我单击浏览器的后退按钮然后单击另一个链接页面不会重定向.它刷新(相反),显然不会购买案例.
刷新后,我可以单击一个链接,它将正确重定向.
现在,当第一页的bean保留在会话中时,所有这些都完全正常,但我不想滥用会话状态,我认为不应该将这些数据保存在会话中.
我知道我可以通过在单击后退按钮时自动重新加载页面来修复此问题(因为视图将被重新创建),但我不确定这是否也是正确的解决方案.(我也不确定如何强迫这个)
有没有人有什么建议?这似乎是一个相当常见的用例,但我真的找不到任何例子.
谢谢!
Bal*_*usC 12
基本上,您需要告诉浏览器在将视图状态保存方法设置为(默认)时不缓存动态生成的JSF页面server
.视图状态由<input type="hidden" name="javax.faces.ViewState">
生成的JSF页面形式的字段跟踪,视图状态标识符作为输入值.当您提交页面并导航到其他页面时,视图状态将在服务器端被删除,并且不再存在.从浏览器缓存中恢复页面仍然会将旧视图状态标识符作为隐藏输入的值.提交该表单根本不起作用,因为无法找到服务器端的视图状态.
您希望直接从服务器而不是浏览器缓存中获取新的新页面.为了告诉浏览器这样做,创建Filter
如下:
@WebFilter(servletNames={"Faces Servlet"})
public class NoCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) request;
HttpServletResponse httpRes = (HttpServletResponse) response;
if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0.
httpRes.setDateHeader("Expires", 0); // Proxies.
}
chain.doFilter(request, response);
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
这样,后退按钮将发送一个完整的HTTP请求,该请求应重新创建视图状态,并在页面中生成具有正确视图状态隐藏字段值的表单.
归档时间: |
|
查看次数: |
3008 次 |
最近记录: |