能否在Jetty上配置WebDav访问?配置遇阻寻求解决方案
嘿,我懂你为啥碰壁了——Tomcat的WebDAV Servlet是绑定在Tomcat自身的容器API上的,直接把catalina.jar丢Jetty里根本跑不起来,两者底层实现差异太大了。下面给你两种靠谱的配置方案,帮你搞定Jetty上的WebDAV访问:
方案一:用Jetty官方WebDAV模块(推荐)
Jetty从9.x版本开始就自带了WebDAV支持,这是最适配的方案,步骤如下:
添加Jetty的WebDAV模块
如果用Jetty的模块化启动方式(通过start.jar),执行以下命令自动添加模块和依赖:java -jar start.jar --add-module=webdav配置WebDAV Servlet
在你的web应用的WEB-INF/web.xml(或者全局的webdefault.xml)里添加以下配置:<servlet> <servlet-name>webdav</servlet-name> <servlet-class>org.eclipse.jetty.servlets.WebdavServlet</servlet-class> <!-- 替换为你实际要共享的文件目录 --> <init-param> <param-name>resourceBase</param-name> <param-value>/opt/webdav/shared-files</param-value> </init-param> <!-- 设置为false允许读写操作,默认是只读 --> <init-param> <param-name>readonly</param-name> <param-value>false</param-value> </init-param> <!-- 可选:开启Basic认证 --> <init-param> <param-name>authMethod</param-name> <param-value>BASIC</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>webdav</servlet-name> <url-pattern>/webdav/*</url-pattern> </servlet-mapping>添加认证(可选但推荐)
要是需要限制访问,在web.xml里补充安全约束:<security-constraint> <web-resource-collection> <web-resource-name>WebDAV Protected Area</web-resource-name> <url-pattern>/webdav/*</url-pattern> <!-- 覆盖WebDAV常用的HTTP方法 --> <http-method>GET</http-method> <http-method>PUT</http-method> <http-method>DELETE</http-method> <http-method>PROPFIND</http-method> <http-method>PROPPATCH</http-method> <http-method>MKCOL</http-method> <http-method>COPY</http-method> <http-method>MOVE</http-method> </web-resource-collection> <auth-constraint> <role-name>webdav-user</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>WebDAV Access Realm</realm-name> </login-config> <security-role> <role-name>webdav-user</role-name> </security-role>然后在Jetty的
etc/jetty-realm.xml里配置用户:<Configure id="Server" class="org.eclipse.jetty.server.Server"> <Call name="addBean"> <Arg> <New class="org.eclipse.jetty.security.HashLoginService"> <Set name="name">WebDAV Access Realm</Set> <Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/jetty-realm.properties</Set> </New> </Arg> </Call> </Configure>对应的
etc/jetty-realm.properties内容示例:# 格式:用户名: 密码, 角色 alice: alice123, webdav-user bob: bob456, webdav-user
方案二:使用通用WebDAV库(Apache Jackrabbit)
如果不想用Jetty官方模块,也可以用Apache Jackrabbit的WebDAV实现,它是标准Servlet,不依赖特定容器:
添加Jackrabbit依赖
下载jackrabbit-webdav-x.x.x.jar(版本选稳定版即可),放到web应用的WEB-INF/lib目录,或者Jetty的lib/ext目录。配置Jackrabbit WebDAV Servlet
在web.xml里添加:<servlet> <servlet-name>jackrabbit-webdav</servlet-name> <servlet-class>org.apache.jackrabbit.webdav.server.WebDAVServerServlet</servlet-class> <init-param> <param-name>resource-path</param-name> <param-value>/opt/webdav/jackrabbit-repo</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jackrabbit-webdav</servlet-name> <url-pattern>/webdav/*</url-pattern> </servlet-mapping>注意:Jackrabbit需要初始化存储库,第一次启动会自动创建相关目录和配置,你也可以手动配置存储库参数来定制行为。
为啥你之前的方法行不通?
Tomcat的org.apache.catalina.servlets.WebdavServlet依赖Tomcat专属的内部API(比如catalina、tomcat-coyote里的类),这些类Jetty完全没有,而且两个容器的Servlet处理逻辑、请求流转机制都不一样,直接丢catalina.jar只会出现ClassNotFound或者各种API兼容错误,根本跑不起来。
内容的提问来源于stack exchange,提问作者Logunbay

