JSF 2.0。无法在 preRenderView 事件处理程序中获取 POST 参数和 cookie

Posted

技术标签:

【中文标题】JSF 2.0。无法在 preRenderView 事件处理程序中获取 POST 参数和 cookie【英文标题】:JSF 2.0. Unable to get POST parameters and cookies in preRenderView event handler 【发布时间】:2012-10-27 14:11:24 【问题描述】:

我正在尝试开发一项服务。

关键是我的 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);

关键是我无法在 start() 方法中获取任何 POST 参数或 cookie。我只能获取 GET 参数。

是否可以使用&lt;f:event type="preRenderView"&gt; 读取 cookie 和 POST 参数?

【问题讨论】:

你可以[以这种方式](***.com/questions/550448/…,但我认为你应该在some recommendations之前考虑一下。问候, 【参考方案1】:

我认为您应该使用 @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"); 

试试这个,我想它会帮助你。

【讨论】:

【参考方案2】:

您还可以使用 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>

在您的支持 bean 中,您应该声明属性 myPostParam 和标准的 setter/getter 方法。作为一项好处,您可以嵌套标准转换器和验证器,让 JSF 处理它。

唯一的限制是这在渲染响应阶段不起作用(您可以在通过返回字符串的操作方法导航时获取 POST 参数)。它将适用于作为 POST 提交目标的视图。

【讨论】:

以上是关于JSF 2.0。无法在 preRenderView 事件处理程序中获取 POST 参数和 cookie的主要内容,如果未能解决你的问题,请参考以下文章

JSF f:event preRenderView 是由 f:ajax 调用和部分渲染触发的,还有别的吗?

jsf 2.0 上的 JSF1064“无法找到或提供资源”警告

JSF 2.0 无法从 primefaces 呈现对话框

无法使用 h:graphicImage JSF 2.0 显示图像

如何在 JSF 2.0 中使用表单重新呈现页面的一部分?

JSF 2.0;我的脸;仅使用 POST 提交表单