如何使Jackrabbit WebDAV servlet允许使用Microsoft Word进行编辑



我正试图通过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 ProPlus

通过使用打开的文档对话框并放入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 Implementation ModeShape制作一个类似的servlet,并没有遇到通过Word持久化文档的问题。

作为一种可能的解释,在Jackrabbit内部调试时,编辑器之间的一个明显区别是LibreOfficeWriter在Authorization标头中通过null发送,而Word在Authorization标头中为其几个请求发送Bearer。由于org.apache.jackrabbit.webdav.DavException: Unable to decode authorization.的异常,所有这些请求都被忽略

有人知道为什么Word在这种情况下不能按预期工作吗?

我确认jackrabbit jcr服务器不支持"Authorization:Bearer"。BasicCredentialsProvider类仅支持"login:password"base64编码的基本身份验证。

出于测试目的,我修改了getCredentials()方法,以在收到承载授权时强制使用"admin/admin"进行基本身份验证:

...
if (authStr.length >= 2 && authStr[0].equalsIgnoreCase(HttpServletRequest.BASIC_AUTH)) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
Base64.decode(authStr[1].toCharArray(), out);
String decAuthStr = out.toString("ISO-8859-1");
int pos = decAuthStr.indexOf(':');
String userid = decAuthStr.substring(0, pos);
String passwd = decAuthStr.substring(pos + 1);
return new SimpleCredentials(userid, passwd.toCharArray());
} else if (authStr.length >= 1 && authStr[0].equalsIgnoreCase("Bearer")) {
return new SimpleCredentials("admin", "admin".toCharArray());
}
throw new ServletException("Unable to decode authorization.");
...

在那之后,我重新编译了jackrabbit jcr服务器(使用maven)并重新部署了它,然后使用MS Word进行了直接编辑。

现在应该做一个更好的实施。。。

相关内容

  • 没有找到相关文章

最新更新