【发布时间】:2019-05-29 20:07:06
【问题描述】:
我正在尝试通过 servlet 公开 Jackrabbit Oak 存储库。虽然我能够使用 LibreOffice Writer 成功检索和编辑 .docx 文件,但 Microsoft Word 不起作用。
我正在使用:
- Jackrabbit Oak 1.8.4 版
- Jackrabbit 版本 2.17.5
- LibreOffice Writer 版本 6.1.3.2
Word 不工作的版本是:
- 版本 1708
- Microsoft Office 365 专业增强版。
我通过使用打开文档对话框并输入http://localhost:8080/helloworld-singleton/repository/default/test.docx,在两个编辑器中类似地访问文档
我使用 OpenSecurityProvider 设置了一个简单的 servlet,它公开了一个复制简单 .docx 文档的本地副本的存储库:
public class SimpleWebdavServlet extends SimpleWebdavServlet {
private static Repository repository;
public Repository getRepository() {
return getRepositoryInternal();
}
static Repository getRepositoryInternal() {
try {
if (repository == null) {
Jcr jcr = new Jcr().with(new OpenSecurityProvider());
repository = jcr.createRepository();
Session session = repository.login(new SimpleCredentials("admin", "admin".toCharArray()));
Node rootNode = session.getRootNode();
if (!rootNode.hasNode("test.docx")) {
importFile(session, rootNode);
}
session.save();
}
} catch (FileNotFoundException | RepositoryException e) {
e.printStackTrace();
}
return repository;
}
private static void importFile(Session session, Node rootNode) throws FileNotFoundException, RepositoryException {
FileInputStream is = new FileInputStream(new File("C:\\test.docx"));
ValueFactory valueFactory = session.getValueFactory();
Binary contentValue = valueFactory.createBinary(is);
Node fileNode = rootNode.addNode("test.docx", "nt:file");
fileNode.addMixin("mix:referenceable");
Node resNode = fileNode.addNode("jcr:content", "nt:resource");
resNode.setProperty("jcr:mimeType", "application/octet-stream");
resNode.setProperty("jcr:data", contentValue);
Calendar lastModified = Calendar.getInstance();
lastModified.setTimeInMillis(lastModified.getTimeInMillis());
resNode.setProperty("jcr:lastModified", lastModified);
session.save();
}
}
这个servlet是通过下面的web.xml配置的:
<web-app>
<display-name>Jackrabbit Webdav</display-name>
<servlet>
<servlet-name>Webdav</servlet-name>
<servlet-class>org.jboss.as.quickstarts.singleton.SimpleWebdavServlet</servlet-class>
<init-param>
<param-name>resource-path-prefix</param-name>
<param-value>/repository</param-value>
</init-param>
<init-param>
<param-name>missing-auth-mapping</param-name>
<param-value>admin:admin</param-value>
</init-param>
<init-param>
<param-name>resource-config</param-name>
<param-value>/WEB-INF/config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Webdav</servlet-name>
<url-pattern>/repository/*</url-pattern>
</servlet-mapping>
</web-app>
使用此代码,我希望能够在 Word 中打开文档,对其进行编辑,然后将更改保存到服务器 - 就像在 LibreOffice Writer 中一样。
与 Word 不同,该文档以受保护的视图打开,尝试保存更改时,系统只会提示您保存它的本地副本。
我尝试为另一个 JCR 实现 ModeShape 制作一个类似的 servlet,并且在那里通过 Word 持久化文档没有遇到任何问题。
作为在 Jackrabbit 内部调试时可能的解释,编辑器之间的一个明显区别是 LibreOffice Writer 在 Authorization 标头中发送 null,而 Word 在 Authorization 标头中发送 Bearer这是请求。由于org.apache.jackrabbit.webdav.DavException: Unable to decode authorization. 的异常,所有这些请求都将被忽略
有人知道为什么 Word 在这种情况下不能按预期工作吗?
【问题讨论】:
-
FWIW,但与您的问题无关:不要在生产代码中使用不稳定的 Jackrabbit 版本(2.17 == 奇数 == 不稳定)。
标签: java ms-word webdav jackrabbit jackrabbit-oak