从Cloud Foundry中部署的Java应用程序连接到本地系统

2020-08-22 03:31发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


正在春季开发Java后端应用程序,该应用程序可以在SAP Cloud Foundry上部署。 我必须连接到内部本地系统。 我已经按照本教程进行了操作: https://help.sap.com /viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/zh-CN/313b215066a8400db461b311e01bd99b.html 以及链接的子教程来进行设置。 但是我仍然无法正确连接到系统,我收到 java.lang.RuntimeException:Http连接失败,状态为403禁止。 我很高兴该系统能够做出响应,但是我无法对自己进行身份验证。 Cloud Connector管理面板显示系统可以访问。 当我进入"目标"选项卡时,我可以看到与系统的连接也成功。 如本教程所述,我的应用程序已绑定到Connectivity和XSUAA服务实例。 这是我用来尝试连接到系统的代码片段

 JSONObject jsonObj =新的JSONObject(System.getenv(" VCAP_SERVICES"));
 JSONArray jsonArr = jsonObj.getJSONArray(" connectivity");
 JSONObject ConnectivityCredentials = jsonArr.getJSONObject(0).getJSONObject(" credentials");

 JSONObject jsonObjXsuaa =新的JSONObject(System.getenv(" VCAP_SERVICES"));
 JSONArray jsonArrXsuaa = jsonObjXsuaa.getJSONArray(" xsuaa");
 JSONObject xsuaaCredentials = jsonArrXsuaa.getJSONObject(0).getJSONObject(" credentials");

 字符串connProxyHost = ConnectivityCredentials.getString(" onpremise_proxy_host");
 int connProxyPort = Integer.parseInt(connectivityCredentials.getString(" onpremise_proxy_http_port"));;
 代理Proxy =新的Proxy(Proxy.Type.HTTP,新的InetSocketAddress(connProxyHost,connProxyPort));

 URL url =新URL(" http://pl-*************.com:8000");

 HttpURLConnection urlConnection =(HttpURLConnection)url.openConnection(proxy);

 字符串clientid = ConnectivityCredentials.getString(" clientid");
 字符串clientsecret = ConnectivityCredentials.getString(" clientsecret");

 URI xsuaaUrl =新URI(xsuaaCredentials.getString(" url"));

 UaaContextFactory factory = UaaContextFactory.factory(xsuaaUrl).authorizePath("/img/oauth/authorize")。tokenPath("/img/oauth/token");
 TokenRequest tokenRequest = factory.tokenRequest();
 tokenRequest.setGrantType(GrantType.CLIENT_CREDENTIALS);
 tokenRequest.setClientId(clientid);
 tokenRequest.setClientSecret(clientsecret);
 UaaContext xsuaaContext = factory.authenticate(tokenRequest);
 CompositeAccessToken accessToken = xsuaaContext.getToken();

 urlConnection.setRequestProperty(" Proxy-Authorization"," Bearer" + accessToken);

 字符串凭据= MessageFormat.format(" {0}:{1}"," USER"," PASSWORD");
 byte [] encodeBytes = Base64.encodeBase64(credentials.getBytes());
 urlConnection.setRequestProperty(" Authorization"," Basic" + new String(encodedBytes)); 
公共静态HttpStatusCodes checkStatus(HttpURLConnection连接)引发IOException {
         HttpStatusCodes httpStatusCode = HttpStatusCodes.fromStatusCode(connection.getResponseCode());
         如果(400 <= httpStatusCode.getStatusCode()&& httpStatusCode.getStatusCode()<= 599){
             抛出新的RuntimeException(" H​​ttp连接失败,状态为" + httpStatusCode.getStatusCode()+"" + httpStatusCode.toString());
         }
         返回httpStatusCode;
 } 

返回的代码是403-禁止,即使我认为我正确提供了所有必需的凭据也是如此。 我想念什么?

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


正在春季开发Java后端应用程序,该应用程序可以在SAP Cloud Foundry上部署。 我必须连接到内部本地系统。 我已经按照本教程进行了操作: https://help.sap.com /viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/zh-CN/313b215066a8400db461b311e01bd99b.html 以及链接的子教程来进行设置。 但是我仍然无法正确连接到系统,我收到 java.lang.RuntimeException:Http连接失败,状态为403禁止。 我很高兴该系统能够做出响应,但是我无法对自己进行身份验证。 Cloud Connector管理面板显示系统可以访问。 当我进入"目标"选项卡时,我可以看到与系统的连接也成功。 如本教程所述,我的应用程序已绑定到Connectivity和XSUAA服务实例。 这是我用来尝试连接到系统的代码片段

 JSONObject jsonObj =新的JSONObject(System.getenv(" VCAP_SERVICES"));
 JSONArray jsonArr = jsonObj.getJSONArray(" connectivity");
 JSONObject ConnectivityCredentials = jsonArr.getJSONObject(0).getJSONObject(" credentials");

 JSONObject jsonObjXsuaa =新的JSONObject(System.getenv(" VCAP_SERVICES"));
 JSONArray jsonArrXsuaa = jsonObjXsuaa.getJSONArray(" xsuaa");
 JSONObject xsuaaCredentials = jsonArrXsuaa.getJSONObject(0).getJSONObject(" credentials");

 字符串connProxyHost = ConnectivityCredentials.getString(" onpremise_proxy_host");
 int connProxyPort = Integer.parseInt(connectivityCredentials.getString(" onpremise_proxy_http_port"));;
 代理Proxy =新的Proxy(Proxy.Type.HTTP,新的InetSocketAddress(connProxyHost,connProxyPort));

 URL url =新URL(" http://pl-*************.com:8000");

 HttpURLConnection urlConnection =(HttpURLConnection)url.openConnection(proxy);

 字符串clientid = ConnectivityCredentials.getString(" clientid");
 字符串clientsecret = ConnectivityCredentials.getString(" clientsecret");

 URI xsuaaUrl =新URI(xsuaaCredentials.getString(" url"));

 UaaContextFactory factory = UaaContextFactory.factory(xsuaaUrl).authorizePath("/img/oauth/authorize")。tokenPath("/img/oauth/token");
 TokenRequest tokenRequest = factory.tokenRequest();
 tokenRequest.setGrantType(GrantType.CLIENT_CREDENTIALS);
 tokenRequest.setClientId(clientid);
 tokenRequest.setClientSecret(clientsecret);
 UaaContext xsuaaContext = factory.authenticate(tokenRequest);
 CompositeAccessToken accessToken = xsuaaContext.getToken();

 urlConnection.setRequestProperty(" Proxy-Authorization"," Bearer" + accessToken);

 字符串凭据= MessageFormat.format(" {0}:{1}"," USER"," PASSWORD");
 byte [] encodeBytes = Base64.encodeBase64(credentials.getBytes());
 urlConnection.setRequestProperty(" Authorization"," Basic" + new String(encodedBytes)); 
公共静态HttpStatusCodes checkStatus(HttpURLConnection连接)引发IOException {
         HttpStatusCodes httpStatusCode = HttpStatusCodes.fromStatusCode(connection.getResponseCode());
         如果(400 <= httpStatusCode.getStatusCode()&& httpStatusCode.getStatusCode()<= 599){
             抛出新的RuntimeException(" H​​ttp连接失败,状态为" + httpStatusCode.getStatusCode()+"" + httpStatusCode.toString());
         }
         返回httpStatusCode;
 } 

返回的代码是403-禁止,即使我认为我正确提供了所有必需的凭据也是如此。 我想念什么?

付费偷看设置
发送
4条回答
haha101010
1楼-- · 2020-08-22 03:56

亲爱的奥斯卡(Oskar)

您似乎遇到了与我相同的问题。 但是,即使在通过直接与目标和连接服务进行交互而使用低级方法时,您似乎也面临此问题。 我希望使用CAP和Cloud SDK可以使事情变得容易。 为此,我创建了项目:

epmbp-consumer-app -java

确实具有一个approuter,它也通过目标和云连接将代理直接公开给后端。 可以毫无问题地调用此URL。 但是,当我从Java模块中调用后端时,遇到了与您相同的问题。 我已经在这里发布了我的问题:

如何将JWT从CAP Java App传递到SAP Cloud SDK Java后端调用

也许您可以尝试我的项目 在您的环境中并在SAP Cloud SDK同事(cc Henning Heitkoetter )的帮助下,它可以正常工作。

最诚挚的问候
格雷戈尔

歪着头看世界
2楼-- · 2020-08-22 04:03

我还有一个NodeJS示例,其中对后端的调用就像一个超级按钮一样起作用:

epmbp-consumer-app

SAP浪
3楼-- · 2020-08-22 03:55

亲爱的Gregor,

在尝试各种方法几天后,我设法找到了适合我的情况的解决方案。 问题出在行中:

 URL url =新URL(" http://pl-*************.com:8000"); 

我认为直接连接到虚拟主机的地址并通过那里的身份验证将使我能够在云连接器中配置的资源之间自由移动。 但是在这种情况下,这不是正确的方法。 在办公室时,我使用Postman从公司网络检查在云连接器中配置的终结点的可用性,因此我不必担心代理身份验证。 我检查了地址虚拟主机是否已映射到,并以404 Not Found响应。 然后,我在子目录之一上执行GET请求,并得到状态为200的答案。这给了我一个提示,也许可以尝试立即到达我最感兴趣的端点。因此,我将有问题的行更改为:

 URL url =新URL(" http://pl-*************.com:8000/pathToEndpoint/dataSet"); 

最后,我还附加了数据集的名称。 通过邮递员,我能够到达目的地,至少我知道应该有可能。 其余代码保持不变。 经过几次尝试并检查我的凭据是否有效,最后我设法从Cloud Foundry中部署的应用程序对本地服务执行GET请求,并获得了期望的响应。 我的应用程序已连接到Connectivity和XSUAA服务实例。

关键部分是使用Postman来查看系统是否响应,从而无需像在云环境中那样在代理处再进行一次身份验证。 我不知道为什么尝试连接到虚拟主机的地址会给我响应代码403禁止而不是404未找到,因为我认为应该如此。

现在,我也在尝试对自己进行身份验证以执行POST请求,但这是单独的问题。

非常感谢您的帮助!

最诚挚的问候
Oskar

当学会了学习
4楼-- · 2020-08-22 03:47

Oskar,您好,

它非常适合您。 我仍然认为值得研究适用于Java的SAP Cloud SDK,因为它应该抽象出您将调用传递到后端所涉及的所有手动步骤。/p>

一周热门 更多>