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 参数。
是否可以使用<f:event type="preRenderView">
读取 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“无法找到或提供资源”警告