Xagent充当在SSL环境中提供非SSL数据的代理



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

以下是我到目前为止所做的:Stephan Wissel 用 Java 编写了一个 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()));

如果有人能告诉我那条线有什么问题,我将不胜感激。提前谢谢。

在你的代码中

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

最新更新