Websphere Portal 7中跨站点Ajax(JSON)调用的代理配置

时间:2011-02-07 22:30:44

标签: ajax json websphere-portal

首先,我是门户开发的新手,因此之前没有Websphere Portal的经验。注意:URL已被更改以保护无辜者。

我在Websphere Portal 7上有一个portlet,我正在尝试向另一台服务器发出Ajax调用(在这种情况下为POST)。我知道我必须创建proxy-config并连接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> 

这是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作为回报。

1 个答案:

答案 0 :(得分:0)

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

由于我的服务调用是在一个单独的.js文件中(通过JavascriptMVC&amp; jQuery),我的快速和脏修复是在.jsp上创建一个JavaScript变量,以便获得如下所示的portlet上下文路径:

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

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

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

现在我正在解决SSL证书问题,但我现在肯定已经完成了代理。