gpt4 book ai didi

jsf - faces-redirect和返回按钮导致其他链接无法正常工作

转载 作者:行者123 更新时间:2023-12-04 13:43:07 25 4
gpt4 key购买 nike

我有一个关于人脸导航的问题。

因此,我有一个页面,该页面带有一个请求参数来加载特定用户。此页面显示commandLink的列表,单击该链接时,将使用隐式导航重定向到另一个页面。通过在“preRenderView”中调用方法来加载用户。

我们重定向到的页面还带有一个request参数,以确定要加载哪种情况。该页面还使用了preRenderView。

两个页面都具有在 View 范围内的bean。

所有这些对于按下的FIRST链接都很棒。第一页将重定向到新的URL,案例将按预期加载。

但是,如果我单击浏览器的后退按钮,然后单击另一个链接,则该页面不会重定向。它会刷新(而不是刷新),并且显然不会购物。

刷新后,我可以单击一个链接,它将正确重定向。

现在,当将第一页的Bean保留在 session 中时,所有这些工作都很好,但是我不想滥用 session 状态,并且我认为不需要将这些数据保留在 session 中。

我知道我可以通过单击后退按钮时自动重新加载页面来解决此问题(因为将重新创建 View ),但是我不确定这是否是正确的解决方案。 (我也不知道该如何强制执行此操作)

有没有人有什么建议?这似乎是一个相当普遍的用例,但是我真的找不到任何示例。

谢谢!

最佳答案

基本上,您需要告诉浏览器在将 View 状态保存方法设置为(默认)server的同时不缓存动态生成的JSF页面。以生成的JSF页面形式的<input type="hidden" name="javax.faces.ViewState">字段跟踪 View 状态,并以 View 状态标识符作为输入值。当您提交页面并导航到其他页面时, View 状态将在服务器端被丢弃,并且不再存在。从浏览器缓存中取回页面仍会为您提供旧 View 状态标识符作为隐藏输入的值。提交该表单将根本无法进行,因为找不到服务器端的 View 状态。

您想直接从服务器而不是从浏览器缓存中获取一个全新的页面。为了告诉浏览器这样做,请创建一个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);
}

// ...
}

这样,后退按钮将发送一个有值(value)的HTTP请求,该请求将重新创建 View 状态,并导致页面的表单具有正确的 View 状态隐藏字段值。

关于jsf - faces-redirect和返回按钮导致其他链接无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7838910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com