0

我们的 Intranet 必须始终使用 https://,这对于存储在我们自己的服务器上的数据来说很好,但会导致从第三方站点获取的数据出现问题。例如,我们有一个来自第三方网站的货币汇率列表。第三方网站不提供 https 选项。为了避免内容被 IE(甚至是最新版本的 Firefox!)阻止,通过代理获取第三方数据似乎是个好主意。我们的管理员并不热衷于设置 Apache 服务器来充当代理,并要求我调查“通过 Xpages 进行”。我是一个完整的 Java 新手,我很难理解为什么我的 Xagent 不起作用。

以下是我到目前为止所做的: Stephan Wissel 用 Ja​​va 编写了一个 HTTPReader 类,我已经设法将它添加到我的 nsf 中。我编写了一个 Xagent,它成功调用了此类的 getURL 方法,并将远程 URL 的内容作为字符串获取。我遇到的问题是读取字符串,以便我可以将其写回。我在 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 ,此外它可能发生在读入最后一行之后,而条件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 回答