我正在尝试开发服务。
关键是我的index.xhtml应该从HTTP Request获取参数(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参数?
答案 0 :(得分:0)
我认为您应该使用@PostConstruct调用init方法,以便在页面呈现之前调用init()&amp;使用全局变量在变量中分配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");
}
尝试这个我认为它会对你有帮助。
答案 1 :(得分: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>
在你的支持bean中,你应该声明属性myPostParam和标准的setter / getter方法。作为一个好处,您可以嵌套标准转换器和验证器,让JSF处理它。
唯一的限制是在渲染响应阶段这不起作用(您可以通过返回String的操作方法导航时获取POST参数)。它将作为POST提交目标的视图工作。