2012-11-07 34 views
7

我正在嘗試開發服務。JSF 2.0。無法在preRenderView事件處理程序中獲取POST參數和cookie

問題是我的index.xhtml應該從HTTP請求中獲取參數(POST和GET)和cookie。

我試着用<f:metadata><f:event type="preRenderView">這樣的組合:

<f:metadata> 
    <f:event type="preRenderView" listener="#{deConversation.start}"/> 
</f:metadata> 

代碼deConversation.start:

public void start(ComponentSystemEvent event) { 
    System.out.println("checkLogin"); 
    HttpServletRequest request = SsoHelper.getRequest(); 
    String requestSessId = SsoHelper.getRequestSessionId(request); 
    String requestRedirect = SsoHelper.getRequestRedirect(request); 

    System.out.println("sessId " + requestSessId); 

    if (requestRedirect == null || requestRedirect.isEmpty()) { 
     requestRedirect = "self"; 
    } 

    if (requestSessId != null) { 
     trySessId(requestSessId, requestRedirect); 
    } 

    externalResourcesHandler.setExternalRedirect(requestRedirect); 
    tryToBeginConversation(); 

    if (!isAuthorized()) { 
     SsoHelper.performNavigation("auth"); 
    } 
} 

SsoHelper只是提供API這樣的:

public static String getRequestSessionId(HttpServletRequest request) { 
    Map<String, Object> cookieMap = FacesContext.getCurrentInstance().getExternalContext().getRequestCookieMap(); 
    String requestDeSessionId = null; 
    if (cookieMap.containsKey("de_session_id")) { 
     requestDeSessionId = ((Cookie) cookieMap.get("de_session_id")).getValue(); 
    } 
    return requestDeSessionId; 
} 

public static String getRequestRedirect(HttpServletRequest request) { 
    return getRequestParam(request, "redirect", "self"); 
} 

public static String getRequestExternalCss(HttpServletRequest request) { 
    return getRequestParam(request, "externalcss", null); 
} 

public static String getRequestParam(HttpServletRequest request, String name, String defaultValue) { 
    String[] paramValues = HttpServletRequestHelper.getParamValues(request, name); 
    String paramValue = null; 
    if (paramValues != null && paramValues.length != 0) { 
     paramValue = paramValues[0]; 
    } 
    if(paramValue == null){ 
     paramValue = defaultValue; 
    } 
    return paramValue; 
} 

public static HttpServletRequest getRequest() { 
    return (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
} 

public static void performNavigation(String destination) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler(); 
    handler.performNavigation(destination); 
} 

點是我無法在m中獲得任何POST參數或cookie ethod start()。我只能獲取GET參數。

使用<f:event type="preRenderView">有沒有可能讀取cookie和POST參數?

+0

你可以這樣做[這種方式](http://stackoverflow.com/questions/550448/get-request-and-session-parameters-and-attributes-from-jsf-pages]但我認爲你應該考慮之前[一些建議](https://forums.oracle.com/forums/thread.jspa?threadID=2218557)。關心, –

回答

0

我認爲你應該使用@PostConstruct調用init方法,以便在頁面呈現之前調用init()&將全局變量分配給變量中的Session或Cookies值,從而達到您的要求。

例子:

@PostConstruct 
public void init(){ 
    // Your Response 
    Map request = (Map)FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
    request.get("Your Key"); 

    // Cookies 
    Map cookie = FacesContext.getCurrentInstance().getExternalContext().getRequestCookieMap(); 
    cookie.get("Your Key"); 

    Map session = FacesContext.getCurrentInstance().getExternalContext().getSessionMap(); 
    session.get("Your Key"); 
} 

試試這個,我認爲它會幫助你。

0

您也可以使用f:viewParam標記來獲取POST/GET參數並將其綁定到您的支持bean的屬性。

更確切地說,標記會使UIViewParameter作爲當前視圖的元數據進行附加。假設你的POST參數名稱是「mypostparam」基本上你可以這樣做:

<f:metadata> 
    <f:viewParam id="mypostparam" name="mypostparam" value="#{deConversation.myPostParam}"/> 
    <f:event type="preRenderView" listener="#{deConversation.start}"/> 
</f:metadata> 

在你的支持豆你應​​該申報財產myPostParam和標準制定者/ getter方法爲好。作爲一個好處,您可以嵌套標準轉換器和驗證器,讓JSF負責處理它。

唯一的限制是在渲染響應階段這不起作用(您可以在通過返回字符串的操作方法進行導航時獲取POST參數)。它將在作爲POST提交目標的視圖上工作。

相關問題