我一直在使用Flash-scope (我知道它不像其他人那样“范围”,但在JSF 2.0中通常被称为“范围”)。 (Mojarra)
我的问题是flash-cookie被绑定到视图的路径,将对象放入flash中 这导致在重定向到同一应用程序中的不同路径后对象不可用。 我们需要在重定向导航的另一端提供字符串(可能还有对象)。
我已经实现了一个@WebFilter
,目的是覆盖它并用以下包装替换ServletResponse
。
private class ResponseWrapper extends HttpServletResponseWrapper{
private final String path;
public ResponseWrapper(HttpServletResponse response, String contextpath) {
super(response);
this.path = contextpath;
}
@Override
public void addCookie(Cookie cookie) {
// Hardcoded name from jsf-impl # com.sun.faces.context.flash.ELFlash
final String FLASH_COOKIE_NAME = "csfcfc";
if (cookie.getName().equals(FLASH_COOKIE_NAME)){
cookie.setPath(path);
}
super.addCookie(cookie);
}
}
实际上,这个包装器将修改flash-cookies以绑定到应用程序context-root。
我的问题是,这是否会引起我不会监督的其他问题
我无法理解为什么Flash
应该首先绑定到视图的路径。
答案 0 :(得分:2)
您的一个假设是不正确的:
是flash-cookie绑定到视图的路径,将对象放入flash中。
事实证明,Flash范围只能保留一次重定向。
换句话说,放置在Flash作用域中的对象将在重定向后继续存在。 http://mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope/
如果你搞乱了cookie和过滤器,你可能做错了什么。 JSF将这些概念抽象出来,这样您就可以使用POJO来完成您的工作。不要乱用Java EE cookie,你要做的工作比你需要的多得多,而且你会立即创建非常脆弱的代码。
要使用闪存范围,请按以下方式获取对它的引用:
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
放下:
flash.put("myObject", myObject);
获取:
Object myObject = flash.get("myObject");
你的hack会导致JSF出现问题吗?我肯定会说,如果不是现在,那么稍后当你尝试升级Mojarra时,请使用不同的容器,或者切换到MyFaces。
答案 1 :(得分:0)
这并没有真正回答你的问题,而是看着这些问题和笔记 - After post is setting a value in JSF2 flash scope, it is visible again on second GET request to a page (Flash scope considered harmful)
也许您应该使用RenderScoped代替(如果适用)?