我已经构建了一个位于菜单栏顶部的登录代码片段。如果用户在任何页面中通过导航并突然按下登录按钮,我会希望看到该人员经过身份验证并同时停留在他最初来自的页面上。所以我在支持bean上使用了这个:
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
然后如果有说mypage.htm?a = 2& b = 2使用request.getQueryString()得到a = 2& b = 2
但getQueryString返回null,我怎样才能完全从支持bean获得原始URL?
答案 0 :(得分:5)
它返回null
,因为命令按钮未提交到包含查询字符串的URL。查看生成的<h:form>
的HTML输出。您将看到生成的HTML <form action>
根本不包含查询字符串。
您需要自己将当前查询字符串作为请求参数传递给登录链接/按钮。
抓取当前请求URI和查询字符串,并将其作为from
参数添加到登录链接/按钮中(注意:使用普通链接/按钮,它不需要是命令链接/按钮):
<h:button value="login" outcome="/login">
<f:param name="from" value="#{request.requestURI}#{empty request.queryString ? '' : '?'}#{request.queryString}" />
</h:button>
在登录页面中,将from
参数设置为视图范围的bean属性:
<f:metadata>
<f:viewParam name="from" value="#{login.from}" />
</f:metadata>
在登录操作方法中,重定向到它:
public void submit() throws IOException {
User user = userService.find(username, password);
if (user != null) {
// ... Do your login thing.
FacesContext.getCurrentInstance().getExternalContext().redirect(from);
} else {
// ... Do your "unknown login" thing.
}
}
答案 1 :(得分:0)
<h:commandButton>
向服务器发送POST请求,更具体地向Faces Servlet
发送POST请求,并开始JSF生命周期。您可能知道,您无法在POST请求中访问查询字符串参数。
如果您想从表单发送GET请求或在访问页面时检索查询字符串参数,则必须使用<f:viewParam>
<f:metadata>
<f:viewParam id="a" name="a" value="#{bean.a}" />
<f:viewParam id="b" name="b" value="#{bean.b}" />
</f:metadata>
更多信息:
答案 2 :(得分:0)
您还可以通过将<h:form>
包裹<h:commandButton>
并将<o:form includeRequestParams="true">
包裹为omnifaces form并将includeRequestParams设置为true来解决此问题:{{1}}。 See BalusC's response to this question.