Jetty9部署多个项目及虚拟主机配置的方法
1.介绍
Jetty会对webapps目录下的几乎所有war包、目录、xml文件进行自动部署。如果war包、目录和xml文件同名,则部署的顺序为xml文件 > war包 > 目录 。如webapps目录下有:bank.war、bank目录、bank.xml,其中目bank录为bank.war解压后的目录,bank.xml中引用的是bank.war包或者bank目录,则此时仅有xml文件被部署。如果它们不同名,但又是同一个工程的,则会导致工程被重复部署!,所以同一个项目的war包、目录、xml文件都应该同名。
2.Jetty的上下文路径(context path)配置
-
默认的上下文路径
默认情况下,Jetty会将webapps目录下的工程名作为上下文路径。如果工程名称为ROOT,则上下文路径为/。如将bank.war(或bank目录)放在webapps目录下,则上下文路径为/bank,如果将bank.war重命名为ROOT.war,则上下文路径为/。那么要访问bank的ULR的上下文路径就是:http://localhost:8888/bank -
自定义上下文路径
如果上述的方式无法满足要求,则可以通过xml文件来配置上下文路径:
- 第一步:在jetty根目录下的webapps目录下创建一个xml文件,名称可以任意,如jetyy-webapp.xml;
- 第二步:假设我们webapps目录下有个bank.war项目,我们来给它配置一个自定义上下文路径,在xml文件中加入如下内容:
jetyy-webapp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="GroceryWebapp" class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/bank888</Set>
<Set name="war"><Property name="jetty.webapps" default="."/>/bank.war</Set>
</Configure>
- 1
- 2
- 3
- 4
- 5
- 6
配置完成后,访问bank站点的上下文路径就是:http://localhost:8888/bank888
3.配置虚拟主机
虚拟主机让访问web的多一种方式,虚拟主机是一般是一个注册在DNS的域名。多个域名对应到一个IP。虚拟主机可以解决共享一个Jetty服务器实例的同一个IP。
虚拟主机的配置有以下方法:
- 在webapps目录下使用一份上下文路径配置的xml文件,如上面的jetty-webapp.xml。
- 给所有在webapps目录下发现的上下文,用绑定配置虚拟主机的方式创建一个自定义部署。
- 在嵌入Jetty的应用情况中,还可以通过直接调用API的方式来实现虚拟主机配置及访问
- 使用WEB-INF/jetty-web.xml来配置虚拟主机(已过时)
3.1虚拟主机的名称
Jetty支持以下这个形式的虚拟主机名称:
- www.hostname.com,类似这样的全限定主机名。这样的配置使用来自www.hostname.com和hostname.com的访问都可以被接收到
- .hostname.com,使用通配符限定主机,但只匹配一级任意名称,如.foo.com可以匹配到www.foo.com和m.foo.com,但无法匹配到www.other.foo.com。
- 10.0.0.2,IP地址也可以用来作为虚拟主机名,这表明上下文要处理从没有指定主机名的服务器端口收到的请求
- @ConnectorName,连接名称,这不是严格意义上的虚拟主机,它只匹配通过Connector.setName(String)设置名称的连接器收到的请求。
- www.√integral.com,非ASCII和IDN域名
3.2配置虚拟主机
我们给上下文/bank888配置虚拟主机:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="GroceryWebapp" class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/bank888</Set>
<Set name="war"><Property name="jetty.webapps" default="."/>/bank.war</Set>
<Set name="virtualHosts"> <Array type="java.lang.String"> <Item>www.MyVirtualDomain.com</Item> <Item>m.MyVirtualDomain.com</Item> <Item>*.OtherVirtualDomain.com</Item> <Item>@ConnectorName</Item> <Item>localhost</Item> <Item>127.0.0.1</Item> </Array>
</Set>
</Configure>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
注意:在实践中,@ConnectorName这种方式,会比较容易出问题,一失败,上下文就会失败。
访问的方式就变成了(虚拟主机+端口+上下文路径):http://127.0.0.1:8080/bank888
如果还需要添加webapps中其他项目的虚拟主机,可以在webapps目录下继续按上面的方式创建xml文件。推荐xml文件与war名称或目录名称一样,否则会引起重复部署。
注意:虚拟主机的方式只是提供了其他的方式来访问web,并不影响原有的访问方式(原有的:IP+端口+上下文路径)。
4.Jetty9下关闭目录访问(关闭目录遍历和关闭目录下的文件展示
- 没有关闭目录访问前,访问http://localhost:8888
上述就将webapps目录下的web全部显示出来了。上面这种情况,是没有配置任何自定义上下文的情况下出现的。 - 自定义配置web的上下文,下关闭目录访问
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="GroceryWebapp" class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/</Set>
<Set name="war"><Property name="jetty.webapps" default="."/>/gro.war</Set>
<Set name="virtualHosts"> <Array type="String"> <Item>www.MyVirtualDomain.com</Item> <Item>m.MyVirtualDomain.com</Item> <Item>*.OtherVirtualDomain.com</Item> <Item>localhost</Item> <Item>127.0.0.1</Item> </Array>
</Set>
<!--关闭目录访问-->
<Call name="setInitParameter">
<Arg>org.eclipse.jetty.servlet.Default.dirAllowed</Arg>
<Arg>false</Arg>
</Call>
</Configure>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
上面定义了web的上下文为/,且关闭目录访问,此时如果访问http://localhost:8888:
注意:实践结果显示,只要自定义配置上下文中,有一个web的上下文是/,那么基本不可能再显示出webapps下的web目录。似乎与下面的配置无任何关系:
<Call name="setInitParameter">
<Arg>org.eclipse.jetty.servlet.Default.dirAllowed</Arg>
<Arg>false</Arg>
</Call>
- 1
- 2
- 3
- 4
扫码查看更多:
文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_40763897/article/details/105505113
- 点赞
- 收藏
- 关注作者
评论(0)