在介绍 tomcat 自定义用户目录前,我们先看看一个例子。假如张三自己搭建了一个网站A,然后张三好朋友李四和王五看见张三的网站很不错,也想在张三网站上面编辑和发表一些网页。于是,张三在服务器上为李四和王五分别创建了一个目录,这些目录用来专门存放李四和王五的网页,并且李四和王五不能互相访问对方的目录。如下图:
上图中,张三可以通过 http://ip:port/index.html 地址访问网站的主页,通过 http://ip:port/~李四/lisi.html 访问李四的 lisi.html 页面,通过 http://ip:port/~王五/wangwu.html 访问王五的 wangwu.html 网页。
注意:url 地址中的波浪线(~)字符加上用户名作为该用户网站的虚拟路径。
在 tomcat 中,使用了几个特殊的 <Listener> 元素,提供两种方式将其映射到每个主机上。<Listener> 的 className 属性应为 org.apache.catalina.startup.UserConfig,而 userClass 属性则指定众多映射类中的一种,directoryName 属性指定用户自定义目录名称,homeBase 属性指定映射目录的公共父目录名称。
如果你的操作系统是 Unix / Linux,并且运行 tomcat 的账号可读取标准的 /etc/passwd 文件,而且 tomcat 自定义用户目录为每个用户主目录,则使用 PasswdUserDatabase 映射类:
<Listener className="org.apache.catalina.startup.UserConfig" directoryName="public_html" userClass="org.apache.catalina.startup.PasswdUserDatabase" />
具体实现方式请参考Linux 下 Tomcat 自定义用户目录1。
如果你没有 /etc/passwd 口令文件,但想要从用户名映射至公共父目录的子目录,则使用 HomesUserDatabase 类:
<Listener className="org.apache.catalina.startup.UserConfig" directoryName="public_html" homeBase="/opt" userClass="org.apache.catalina.startup.HomesUserDatabase" />
具体实现方式请参考Linux 下 Tomcat 自定义用户目录2。