首先,我是门户开发的新手,因此之前没有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。我查看了“规则”格式,但未能找到有效的解决方案。
有几点需要注意:
答案 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证书问题,但我现在肯定已经完成了代理。