编者注
主要目的,各种网盘并不是控制在个人手中,而且不同网盘,导致文件分散,难以整合。多台计算机的使用,软件的环境位置发生变化,一致性无法保证。通过搜索并对比文件分享协议。WebDAV能够达到并完成该内容。由于Windows 10加入了WebDAV,Linux支持WebDAV,Mac也同样支持WebDAV。则使用WebDAV是能够跨平台进行使用与操作的。
目标
这里并不是想要简单配置并使用WebDAV,而是希望通过某种方式,实现用户登陆与权限限制,保证除了个别软件需要直接通过文件系统进行读写外,完整的实现网盘功能(一般文件的读写),特殊目录只读功能。在脑子里面的理想型文件共享,与服务提供。优先支持常用服务,替代传统方式。
Apache Tomcat WebDAV
通过查询,否决了Apache JackRabbit的WebDAV。再次搜索发现Tomcat HTTP Nigix支持WebDAV协议。但是均只是简单的实现。和需求不符。
由于本人Java熟悉,决定由Java入手。通过查看Tomcat资料,了解到org.apache.catalina.servlets.WebdavSerlvet.java为WebDAV的实现。需要下载tomcat源代码,当前还不能确定,能否修改成为Spring的项目。
暂时架构决定
Spring || VFS
阅读与分析WebdavServlet
通过阅读代码,能够了解Webdav所需要的函数内容,通过如下service函数
/** * Handles the special WebDAV methods. */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { final String path = getRelativePath(req); // Block access to special subdirectories. // DefaultServlet assumes it services resources from the root of the web app // and doesn't add any special path protection // WebdavServlet remounts the webapp under a new path, so this check is // necessary on all methods (including GET). if (isSpecialPath(path)) { resp.sendError(WebdavStatus.SC_NOT_FOUND); return; } final String method = req.getMethod(); if (debug > 0) { log("[" + method + "] " + path); } if (method.equals(METHOD_PROPFIND)) { doPropfind(req, resp); } else if (method.equals(METHOD_PROPPATCH)) { doProppatch(req, resp); } else if (method.equals(METHOD_MKCOL)) { doMkcol(req, resp); } else if (method.equals(METHOD_COPY)) { doCopy(req, resp); } else if (method.equals(METHOD_MOVE)) { doMove(req, resp); } else if (method.equals(METHOD_LOCK)) { doLock(req, resp); } else if (method.equals(METHOD_UNLOCK)) { doUnlock(req, resp); } else { // DefaultServlet processing super.service(req, resp); } }