Конфигурация прокси для межсайтовых вызовов Ajax (JSON) в Websphere Portal 7 - PullRequest
0 голосов
/ 08 февраля 2011

Во-первых, я новичок в разработке порталов в целом и, таким образом, ранее не имел опыта работы с Websphere Portal. Примечание. URL-адреса были изменены, чтобы защитить невинных.

У меня есть портлет на Websphere Portal 7, где я пытаюсь сделать Ajax-вызов (в данном случае POST) на другой сервер. Я знаю, что мне нужно создать прокси-конфиг и подключить ProxyServlet, чтобы Portal разрешал межсайтовый вызов ajax, и я это сделал. Однако при вызове прокси-службы я получаю сообщение 403 Forbidden.

Вот мой proxy-config.xml:

<proxy:proxy-rules 
      xmlns:proxy="http://www.ibm.com/xmlns/prod/sw/ajax/proxy-config/1.1" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <proxy:mapping contextpath="/proxy" url="*"/> 
      <proxy:policy acf="none" url="*"> 
            <proxy:actions> 
                  <proxy:method>GET</proxy:method> 
                  <proxy:method>POST</proxy:method> 
            </proxy:actions> 
      </proxy:policy> 
      <proxy:policy acf="none" url="https://subdomain.domain.org/ss/services/*"> 
            <proxy:actions> 
                  <proxy:method>GET</proxy:method> 
                  <proxy:method>POST</proxy:method> 
            </proxy:actions> 
      </proxy:policy> 
      <proxy:meta-data> 
            <proxy:name>max-connections-per-host</proxy:name> 
            <proxy:value>5</proxy:value> 
      </proxy:meta-data> 
      <proxy:meta-data> 
            <proxy:name>max-total-connections</proxy:name> 
            <proxy:value>100</proxy:value> 
      </proxy:meta-data> 
</proxy:proxy-rules> 

Вот ProxyServlet в web.xml:

<servlet>
    <servlet-name>ProxyServlet</servlet-name>
    <servlet-class>com.ibm.wps.proxy.servlet.ProxyServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ProxyServlet</servlet-name>
    <url-pattern>/ss/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ProxyServlet</servlet-name>
    <url-pattern>/proxy/*</url-pattern>
</servlet-mapping>

А вот URL, который я пытаюсь вызвать из javascript (через jQuery):

"wps/proxy/https/subdomain.domain.org/ss/services/service1"

В настоящее время я получаю сообщение об ошибке 403 Forbidden "URL, к которому вы пытались получить доступ через прокси-сервер, запрещен". И вот URL-адрес Firebug показывает, что портлет работает (кажется правильным): http://portalsubdomain.domain.org:77777/wps/proxy/https/subdomain.domain.org/ss/services/service1.

Исходя из прокси-документов для wp7, я знаю, что 403 означает одно из следующего:

  • Запрос не был принят прокси-сервером, то есть прокси-сервер не нашел подходящую политику доступа, которая предоставляет доступ к целевому серверу.
  • Базовая аутентификация не удалась.

Он должен был найти политику прокси, так как я определил ее для всех URL, так что мне не хватает? Я полагаю, что либо неправильно настроил политику прокси (аутентификация?), Либо неправильно сконструировал URL в вызове JSON. Я просмотрел формат «правила», но не смог найти решение, которое работает.

Обратите внимание на пару вещей:

  • Этот портлет находится на дочерней странице другой страницы, а dojo является частью пользовательской темы, которую мы создали
  • Мы используем LDAP для входа на портал, поэтому не уверены, что это также имеет значение. Я выполняю вход с правами администратора портала при запуске этого.
  • URL-адрес страницы, на которую загружается портлет (и, следовательно, структура страницы / пространства), http://portalsubdomain.domain.org:77777/wps/demoportal/home/demo/ajaxTest. Не уверен, что ищет прокси, но proxy-config.xml находится внутри моего папка WEB-INF портлета.
  • Если я изменю URL в своем вызове JSON на wps / demoportal / home / demo / ajaxTest / proxy / https / subdomain.domain.org / ss / services / service1, я получу HTML-код для страницы ajaxTest в ответ.

1 Ответ

0 голосов
/ 09 февраля 2011

Нашли решение! Мне нужно было получить контекстный путь к портлету и добавить его к URL-адресу службы.

Поскольку мой вызов службы находится в отдельном файле .js (через JavascriptMVC и jQuery), мое быстрое и грязное исправление заключается в создании переменной JavaScript в .jsp для получения пути к контексту портлета следующим образом:

var globalRequestContextUrl = "<%= renderResponse.encodeURL(renderRequest.getContextPath()) %>";

затем в своем вызове ajax я добавляю URL-адрес контекста к моему вызову прокси-сервера следующим образом:

globalRequestContextUrl + "https/subdomain.domain.org/ss/services/service1"

Сейчас я борюсь с проблемами SSL-сертификатов, но я определенно пробираюсь через прокси.

...