对于基于xpages的网页的Web用户,是否有办法能够显示(仅限读取模式)数据库中的文档,其中匿名者无法访问acl。
如果我有访问权限,我可以获取该文档,例如:
https://servername/otherdatabase.nsf/O/"+thisid+"/$FILE/"+thisdocument
我想使用SessionAsSigner一定可以,但是怎么做?
其次,这个用户有没有办法从匿名无法访问的数据库中查看视图?我该怎么设置呢?
答案 0 :(得分:9)
另一种选择是使用XAgent;例如,将beforeRenderResponse
事件设置为以下内容:
var fileDb = sessionAsSigner.getDatabase((param.server || ""), param.path);
var fileDocument = fileDb.getDocumentByUNID(param.id);
var attachment = fileDocument.getAttachment(param.filename);
var inputStream = attachment.getInputStream();
var response = facesContext.getExternalContext().getResponse();
/* The following MIME type is generic, should work for all image types;
If you know what type the image will be, set a more specific MIME type */
response.setContentType("application/octet-stream");
var outputStream = response.getOutputStream();
com.acme.xsp.util.StreamUtil.copyStream(inputStream, outputStream);
inputStream.close();
outputStream.close();
attachment.recycle();
fileDocument.recycle();
facesContext.responseComplete();
com.acme.xsp.util.StreamUtil
指的是用于将一个流管道传输到另一个流的Java便捷类:
public class StreamUtil {
public static void copyStream(InputStream input, OutputStream output) throws IOException {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
}
}
因此,不是将图片标记直接链接到附件,而是看起来像这样:
<xp:image url="/download.xsp?server=ACME01&path=images.nsf&id=OU812&filename=photo.jpg" />
这种方法还可以为您提供其他选项:记录访问给定文件的次数,引用URL(如果您想实现在搜索Google时有时会看到的“无链接”图像替换),或者真的你想要的任何东西。
作为一个具体的例子,大约十年前,我看到一位同事实施了与Google Analytics相当的基本内部工作,甚至可以在不支持JavaScript的浏览器上工作,因为他在每一页的公司徽标上使用了这种技术。网站:他没有直接链接到JPG徽标,而是链接到一个抓取IP,引用,用户代理等的PHP文件,将所有元数据写入MySQL数据库,然后最终将徽标的字节流式传输到浏览器。这显然超出了你想要完成的范围,但我想你可能会觉得有趣的是,现在这种类型的用例在XPages中相当简单。
答案 1 :(得分:4)
这可以使用sessionAsSigner,例如重复。如果XPage位于同一数据库中,请确保将XPage标记为可用于公共访问。下面的简单示例将显示视图列中的内容和文档中的图像:
<xp:repeat id="protectedView" rows="15" removeRepeat="true" var="rowEntry" disableOutputTag="true">
<xp:this.value><![CDATA[#{javascript:
var thisDb = sessionAsSigner.getDatabase(database.getServer(), database.getFilePath());
var aView = thisDb.getView("protectedView");
return staffView.getAllEntries(); // return collection of docs
}]]></xp:this.value>
<xp:text>
<xp:this.value><![CDATA[#{javascript:rowEntry.getColumnValues().elementAt(1)}]]></xp:this.value>
</xp:text>
<xp:br />
<xp:text>
<xp:this.value><![CDATA[#{javascript:rowEntry.getColumnValues().elementAt(2)}]]></xp:this.value>
</xp:text>
<xp:br />
<xp:inputRichText id="inputRichText1" readonly="true">
<xp:this.value><![CDATA[#{javascript:
// wrap NotesDocument into NotesXspDocumenet to easily display picture
wrapDocument(rowEntry.getDocument()).getValue("Picture");}]]></xp:this.value>
</xp:inputRichText>
</xp:repeat>
我使用the wrapDocument XSnippet将NotesDocument转换为NotesXspDocument。
答案 2 :(得分:2)
基本上这是不可能的。
您可以使用sessionAsSigner构建URL,但是当用户尝试访问文档/图像时,他们将获得未经授权的例外。
显示数据视图的唯一方法是使用sessionAsSigner将视图内容读入范围变量(或bean),然后显示引用范围变量而不是视图中的数据的重复控件直。
更大的问题是你想要这样做的原因。如果Anonymous无法访问相关数据库,那么就有充分的理由。另一种方法是考虑在您希望匿名访问的文档/视图上使用$ PublicAccess标志。然后在ACL上,只要Anonymous可以读取公共数据,那么他们仍然无法访问数据库。
马特