0

私たちのイントラネットでは、常に https:// を使用する必要があります。これは、私たち自身のサーバーに保存されているデータには問題ありませんが、サード パーティのサイトから取得したデータには問題を引き起こします。たとえば、サードパーティのサイトからの為替レートのリストがあります。サードパーティのサイトは https オプションを提供していません。コンテンツが IE (そして最新リリース以降は Firefox でも!) によってブロックされないようにするには、プロキシ経由でサード パーティのデータを取得することをお勧めします。私たちの管理者は、プロキシとして機能するように Apache サーバーをセットアップすることに熱心ではなく、「Xpages を介して実行する」方法を調査するように私に依頼しました。私はまったくの Java 初心者で、Xagent が機能しない理由を理解するのに苦労しています。

これまでに行ったことは次のとおりです。Stephan Wissel が Java で HTTPReader クラスを作成し、それを nsf に追加することができました。このクラスの getURL メソッドを正常に呼び出し、リモート URL のコンテンツを文字列としてフェッチする Xagent を作成しました。私が抱えている問題は、書き戻すことができるように文字列を読み取ることです。BufferedReader 行で「JavaScript アクション式の実行中にエラーが発生しました」というエラーが表示されます。これは私のXagentコードです:

<xp:this.beforeRenderResponse><![CDATA[#{javascript:importPackage(org.lotususers.tools);
importPackage(java.io);

var httpReader = org.lotususers.tools.HTTPReader();
var remoteURL = context.getUrlParameter("ru");
var remoteHTML:String = httpReader.getURL(remoteURL);

var bufferedReader:BufferedReader = new BufferedReader(new InputStreamReader(remoteHTML));

var outputString = "";
while(bufferedReader.readLine() != null){
    outputString += bufferedReader.readLine();
};

var externalContext = facesContext.getExternalContext();
var writer = facesContext.getResponseWriter();
var response = externalContext.getResponse();
response.setContentType("text/html");
response.setHeader("Cache-Control", "no-cache");

writer.write(outputString);
writer.endDocument();
}]]></xp:this.beforeRenderResponse>

コンソールに出力する行remoteHTML(つまり、print(remoteHTML)) を入力すると、HTML が正常に取得されたことがわかるので、少なくともその部分が機能したことがわかります。

私は何時間もかけて BufferedReader に関するドキュメントを読み、何が間違っていたのかを突き止めようとしました。BufferedReader 行で見つけることができるすべてのバリエーションを試しましたが、何も機能しません (.openStream()または.getInputStream())。例えば:

var bufferedReader:BufferedReader = new BufferedReader(new InputStreamReader(remoteHTML.getInputStream()));

私もパスを完全に修飾しようとしましたが、これは違いはありませんでした:

var bufferedReader:java.io.BufferedReader = new java.io.BufferedReader(new java.io.InputStreamReader(remoteHTML.getInputStream()));

誰かがその行の何が問題なのか教えてくれたらとてもありがたいです. 前もって感謝します。

4

1 に答える 1

1

あなたのコードで

while(bufferedReader.readLine() != null){
    outputString += bufferedReader.readLine();
};

outputString に入力する 1 行おきに行を逃す可能性があり、さらに最後の行が読み込まれた後に発生する可能性outputString += bufferedReader.readLine();があり、行がなくなったために JavaScript エラーがスローされるという条件が発生する可能性があります。

代わりに次のコードを使用します。

var line = bufferedReader.readLine();
while(line != null){
    outputString += line;
    line = bufferedReader.readLine();
};

編集:

次の XAgent は、探していることを実行する必要があります。httpReader.getURL(remoteURL)はすでに完成した HTML を提供するので、すぐにライターとして使用でき、ストリームを処理する必要はありません。

<xp:this.beforeRenderResponse><![CDATA[#{javascript:
try { 
    var httpReader = org.lotususers.tools.HTTPReader();
    var remoteURL = context.getUrlParameter("ru");
    var remoteHTML = httpReader.getURL(remoteURL);
    var externalContext = facesContext.getExternalContext(); 
    var response = externalContext.getResponse(); 
    var writer = response.getWriter(); 
    response.setContentType("text/html"); 
    response.setHeader("Cache-Control", "no-cache"); 
    writer.write(remoteHTML); 
    facesContext.responseComplete(); 
} catch (e) { 
    _dump(e); 
}}]]></xp:this.beforeRenderResponse>

XAgent は、パラメータ「ru」で定義されたターゲット URL のページ コンテンツを返します。これは、XAgent を呼び出すための URL の例です。

https://Server/Test.nsf/XAgent.xsp?ru=http://www.web.de
于 2013-09-11T11:44:28.253 に答える