0

首先,我通常是门户网站开发的新手,因此以前没有使用 Websphere Portal 的经验。注意:网址已更改以保护无辜者。

我在 Websphere Portal 7 上有一个 portlet,我试图在其中对另一台服务器进行 Ajax 调用(在本例中为 POST)。我知道我必须创建代理配置并连接 ProxyServlet,以便 Portal 允许跨站点 ajax 调用,我已经做到了。但是,在调用代理服务时,我收到了 403 Forbidden 消息。

这是我的代理配置.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> 

这是 web.xml 中的 ProxyServlet:

<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>

这是我试图从 javascript(通过 jQuery)调用的 URL:

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

我目前收到 403 Forbidden “不允许您尝试通过代理访问的 URL”错误消息。这是 Firebug 显示 portlet 正在命中的 URL(似乎是正确的): http://portalsubdomain.domain.org:77777/wps/proxy/https/subdomain.domain.org/ss/services/service1

根据 wp7 的代理文档,我知道 403 意味着以下之一:

  • 该请求未被代理接受,即代理未找到授予目标服务器访问权限的匹配访问策略。
  • 基本身份验证失败。

它应该找到代理策略,因为我已经为所有 URL 定义了它,所以我错过了什么?我想我要么没有正确配置代理策略(身份验证?),要么我没有正确构建 JSON 调用中的 URL。我查看了“规则”格式,但未能提出可行的解决方案。

有几点需要注意:

  • 这个 portlet 在另一个页面的子页面上,dojo 是我们创建的自定义主题的一部分
  • 我们正在使用 LDAP 登录门户,所以不确定这是否也有什么不同。运行此程序时,我正在使用门户管理员权限登录。
  • 正在加载 portlet 的页面(以及页面/空间结构)的 URL 是http://portalsubdomain.domain.org:77777/wps/demoportal/home/demo/ajaxTest。不确定代理在寻找什么,但 proxy-config.xml 位于我的 portlet 的 WEB-INF 文件夹中。
  • 如果我将 JSON 调用中的 URL 更改为 wps/demoportal/home/demo/ajaxTest/proxy/https/subdomain.domain.org/ss/services/service1,我将获得 ajaxTest 页面的 HTML 作为回报。
4

1 回答 1

0

找到了解决方案!我需要获取 portlet 的上下文路径并将其添加到服务 URL。

由于我的服务调用在一个单独的 .js 文件中(通过 JavascriptMVC 和 jQuery),我快速而肮脏的解决方法是在 .jsp 上创建一个 JavaScript 变量,以便像这样获取 portlet 上下文路径:

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

然后在我的 ajax 调用中,我将上下文 url 添加到对代理的调用中,如下所示:

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

现在我正在解决 SSL 证书问题,但我现在肯定会通过代理。

于 2011-02-08T23:01:56.503 回答