WebSpherePortal7中跨站点Ajax(JSON)调用的代理配置

WebSpherePortal7中跨站点Ajax(JSON)调用的代理配置,ajax,json,websphere-portal,Ajax,Json,Websphere Portal,首先,我一般不熟悉门户开发,因此以前没有使用WebSpherePortal的经验。注意:URL已被更改以保护无辜者 我在WebSpherePortal7上有一个portlet,我试图在其中对另一台服务器进行Ajax调用(在本例中是POST)。我知道我必须创建代理配置并连接ProxyServlet,以便门户允许跨站点ajax调用,我已经做到了。然而,我在调用代理服务时收到一条403禁止消息 下面是我的proxy-config.xml: <proxy:proxy-rules xm

首先,我一般不熟悉门户开发,因此以前没有使用WebSpherePortal的经验。注意:URL已被更改以保护无辜者

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

下面是我的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> 
我目前收到403禁止“您试图通过代理访问的URL不允许”错误消息。这是Firebug显示portlet正在命中的URL(似乎是正确的):

根据wp7的代理文档,我知道403表示以下内容之一:

  • 代理未接受该请求,即代理未找到授予对目标服务器访问权限的匹配访问策略
  • 基本身份验证失败
它应该已经找到了代理策略,因为我已经为所有URL定义了它,那么我缺少了什么呢?我想我要么没有正确配置代理策略(身份验证?),要么没有在JSON调用中正确构造URL。我查看了格式“规则”,但没有找到一个有效的解决方案

有几件事需要注意:

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

    • 找到了解决方案!我需要获取portlet的上下文路径,并将其前置到服务URL

      由于我的服务调用位于一个单独的.js文件中(通过JavascriptMVC和jQuery),因此我的快速修复方法是在.jsp上创建一个JavaScript变量,以获得如下portlet上下文路径:

      var globalRequestContextUrl = "<%= renderResponse.encodeURL(renderRequest.getContextPath()) %>";
      
      现在我正在与SSL证书问题作斗争,但我现在肯定要通过代理

      "wps/proxy/https/subdomain.domain.org/ss/services/service1"
      
      var globalRequestContextUrl = "<%= renderResponse.encodeURL(renderRequest.getContextPath()) %>";
      
      globalRequestContextUrl + "https/subdomain.domain.org/ss/services/service1"