Как получить параметры строкового запроса из URL в Domino - PullRequest
0 голосов
/ 09 ноября 2019

Через некоторое время мне удалось сделать редирект с какого-то 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();
        }
}

Вот что происходит:

  1. В браузере пользователь инициализирует процесс авторизации, нажавкнопка
  2. Затем initializeAuthProcess выполняет запрос к системе A
  3. Система A переносит нас в систему B, мы перенаправляем туда пользователя
  4. Пользователь проходит авторизациюпроцесс в системе B
  5. Система B (после авторизации) перенаправляет пользователя в нашу систему
  6. И добавляет в свой системный URL какой-то токен под названием marker

Позже мы должны что-то сделать с маркером ...

Проблема в том, что мы не знаем, как получить маркер. Это всегда либо ноль, либо пусто. Однако в браузере мы всегда можем увидеть его после успешного завершения аутентификации в системе B.

enter image description here

Я получаю следующий вывод:

marker param is null
marker param is 
url https://oursystem.com/Nav2.xsp

Нам также интересно, как удалить его из URL после завершения обработки. Но на данный момент нам нужно получить его как минимум.

Как мы можем это сделать?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Очевидно, дело в том, что код выполняется сразу же, без ожидания авторизации пользователя в системе B.

Например, если мы снова нажмем кнопку, у нас будетmarker param.

Таким образом, нам нужен другой подход, мы должны определить маркер и сделать что-то с ним

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

Если вы нажмете кнопку, вы будете перенаправлены на другую страницу. Поэтому тестирование маркера должно выполняться на этапе обратного вызова между 5 и 6. Проверьте в событии beforeRenderResponse, есть ли маркер, и вы можете отреагировать на него.

0 голосов
/ 10 ноября 2019

Ты смотришь не с того конца. Есть 2 варианта: выбрать маркер из возвращенного ответа1, вызывающего другие системы, или переместить этот код на страницу, которую вы перенаправили на

...