【发布时间】:2019-11-09 14:24:17
【问题描述】:
一段时间后,我设法从某些 API 进行重定向。
但是,现在我面临一个不同的问题。
似乎没有办法从 URL 中获取查询参数。
按钮看起来像这样:
<xp:eventHandler event="onclick" submit="true"
refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
var redirectUrl = context.getUrl().toString();
var errorRedirectUrl = context.getUrl().toString();
var EGRZAuthObject = new ru.iteko.egrz.requestprocessors.EGRZAuthorization();
//auth which redirects
EGRZAuthObject.initializeAuthProcess(redirectUrl, errorRedirectUrl);
print("marker param is " + param.get("marker"));
print("marker param is " + facesContext.getExternalContext().getRequest().getQueryString());
print("url " + context.getUrl().toString());
}]]></xp:this.action>
</xp:eventHandler>
重定向的方法如下:
public static void initializeAuthProcess(String redirectUrl, String apiRedirectUrl) throws ClientProtocolException, IOException
{
CloseableHttpClient httpclient = HttpClients.createDefault();
try
{
HttpContext context = new BasicHttpContext();
String urlToGoTo = AuthURLs.ESIALoginURL(redirectUrl, apiRedirectUrl);
HttpGet httpGet = new HttpGet(urlToGoTo);
HttpResponse response1 = httpclient.execute(httpGet, context);
HttpUriRequest currentReq = (HttpUriRequest) context.getAttribute(
HttpCoreContext .HTTP_REQUEST);
HttpHost currentHost = (HttpHost) context.getAttribute(
HttpCoreContext .HTTP_TARGET_HOST);
String redirectURLEsia = (currentReq.getURI().isAbsolute()) ? currentReq.getURI().toString() : (currentHost.toURI() + currentReq.getURI());
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext externalContext = fc.getExternalContext();
externalContext.redirect(redirectURLEsia);
}
finally
{
httpclient.close();
}
}
会发生什么:
- 在浏览器中,用户通过按下按钮来初始化身份验证过程
- 然后
initializeAuthProcess向系统A执行请求 - 系统 A 将我们带到系统 B,我们将用户重定向到那里
- 用户在系统B中经过授权过程
- 系统 B(经过身份验证)将用户重定向到我们的系统
- 它会在我们系统的 URL 中附加某种标记,称为
marker
稍后,我们应该对标记做点什么......
问题是我们不知道如何获取标记。它始终为 null 或为空。但是在浏览器中,我们总是可以在系统B中的auth成功完成后看到它。
我得到以下输出:
marker param is null
marker param is
url https://oursystem.com/Nav2.xsp
我们还想知道如何在处理完成后将其从 URL 中删除。但到目前为止,我们至少需要得到它。
我们该怎么做?
提前致谢。
编辑:
显然,代码会立即执行,而无需等待系统 B 中的用户授权。
例如,如果我们再次按下按钮,我们将获得marker 参数。
所以我们需要一种不同的方法,我们应该定义标记并用它做一些事情
【问题讨论】:
标签: xpages lotus-notes xpages-ssjs query-parameters facescontext