2012-07-10 94 views
1

我一直在使用Flash範圍 (我知道它不像其他的「範圍」,但通常被稱爲「JSF 2.0」中的範圍)。 (Mojarra)JSF 2.0 Flash-scope - Cookie路徑

我的問題是,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以綁定到應用程序上下文根。

我的問題是這是否會導致其他問題,我不監督。
我無法理解爲什麼Flash應該首先綁定到視圖的路徑。

回答

2

你的一個假設是不正確的:

是閃光的Cookie勢必把對象閃光燈視圖的路徑。

事實證明,Flash範圍只能存活一次重定向。

換句話說,放置在Flash作用域中的對象將在重定向後繼續存在。 http://mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope/

如果你搞亂了cookies和過濾器,你可能做錯了什麼。 JSF將這些概念抽象出來,以便您可以使用POJO來完成您的工作。不要混淆Java EE cookie,你會做更多的工作,而且你會立即創建非常脆弱的代碼。

使用閃光燈範圍,抓住這樣的一個引用:

Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 

要放:

flash.put("myObject", myObject); 

獲取:

Object myObject = flash.get("myObject"); 

請問您的黑客造成的問題與JSF?我會肯定地說,如果不是現在,那麼當你嘗試升級Mojarra時,使用不同的容器,或切換到MyFaces。

+1

>你的一個假設是不正確的: - 這是不正確的。由於一個錯誤(實際上有幾個),這確實是在Mojarra發生的事情。 – 2013-06-30 07:13:04