Через некоторое время мне удалось сделать редирект с какого-то 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
Позже мы должны что-то сделать с маркером ...
Проблема в том, что мы не знаем, как получить маркер. Это всегда либо ноль, либо пусто. Однако в браузере мы всегда можем увидеть его после успешного завершения аутентификации в системе B.
Я получаю следующий вывод:
marker param is null
marker param is
url https://oursystem.com/Nav2.xsp
Нам также интересно, как удалить его из URL после завершения обработки. Но на данный момент нам нужно получить его как минимум.
Как мы можем это сделать?
Заранее спасибо.
РЕДАКТИРОВАТЬ:
Очевидно, дело в том, что код выполняется сразу же, без ожидания авторизации пользователя в системе B.
Например, если мы снова нажмем кнопку, у нас будетmarker
param.
Таким образом, нам нужен другой подход, мы должны определить маркер и сделать что-то с ним