Я пытаюсь раскрыть хранилище Jackrabbit Oak через сервлет. Хотя я могу успешно извлечь и отредактировать файл .docx
с помощью LibreOffice Writer, Microsoft Word не работает.
Я использую:
- Дуб Кролика, версия 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
, который предоставляет хранилище, которое копирует локальную копию простого документа .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();
}
}
Этот сервлет настраивается через 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 и не испытывал проблем с сохранением документов через Word.
В качестве возможного объяснения при внутренней отладке внутри Jackrabbit, заметное различие между редакторами заключается в том, что LibreOffice Writer отправляет более null
в заголовке Authorization
, а Word отправляет Bearer
в заголовке Authorization
для нескольких из это запросы. Все эти запросы затем игнорируются из-за исключения org.apache.jackrabbit.webdav.DavException: Unable to decode authorization.
Кто-нибудь знает, почему Word в этом случае не работает должным образом?