Jetty:配置上下文
這篇文件講述配置Jetty上下文的各種選項。
設置上下文路徑
上下文路徑是一個URL路徑的前綴,用于將一個輸入請求相應到相應的上下文。Java Servlet Server的URL通常的格式為:http://hostname.com/contextPath/servletPath/pathInfo。假設沒有上下文路徑,則相應上下文為根上下文,根上下文必須被配置為"/"。
你怎么設置上下文路徑依賴你怎么部署web應用(或者ContextHandler):
用內嵌式部署
假設你執行Jetty使用通過編碼將Jetty作為內嵌的server的方式(在后面會專門解說怎么實現)。設置上下文路徑通過調用ContextHandler實例(或WebAppContext實例)的setContextPath方法實現。
通過命名約定
假設一個web應用被DeploymentManager的WebAppProvider部署,但沒實用XML IoC文件。那么WAR文件的名字被用于設置上下文路徑。
?1)假設WAR文件被命名為myapp.war。那么上下文路徑將是/myapp;
?2)假設WAR文件被命名為ROOT.WAR(不區分大寫和小寫),那么上下文路徑為/。
?3)假設WAR文件被命名為ROOT-foobar.war(不區分大寫和小寫),按么上下文路徑為/,并相應一個“foobar”的虛擬主機(下一節解說)。
不同部署器配置
假設一個web應用被DeploymentManager的WebAppProvider部署,并帶有XML IoC文件配置上下文,那么setContextPath方法能夠在文件里被調用。比如:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"><Set name="contextPath">/test</Set>... </Configure>嵌入一個WEB-INF/jetty-web.xml文件
你也能為webapps設置上下文路徑通過在WAR包中內嵌一個WEB-INF/jetty-web.xml文件,用相同的XML IoC格式(上面的樣例)。
但因為它要求web應用被改動,因此不是一個首先的方式。
配置虛擬主機
一個虛擬主機是為一個IP地址的可選擇的名字。注冊在DNS,這樣多個域名能夠相應到同樣的IP。
虛擬主機通過調用setVirtualHosts或addVirtualHost方法設置到上下文。能夠通過以下方式之中的一個實現:
?1)用webapps目錄中的上下文XML文件(看jetty公布版本號中的test.xml文件);
?2)用WEB-INF/jetty-web.xml文件(不贊成)。
?3)創建一個自己定義的部署器。部署器為同一個webapps目錄中的全部上下文綁定配置的虛擬主機;
?4)使用內嵌代碼調用API設置。
虛擬主機名
Jetty支持以下的虛擬主機名:
?1)www.hostname.com
?2)*.hostname.com
?3)10.0.0.2
?4)@ConnectorName:連接器名
?5)www.√integral.com
虛擬主機配置舉例
虛擬主機能與不論什么ContextHandler的子類的上下文一起使用。讓我們看一個使用虛擬主機配置web應用的樣例-通過WebAppContext類表示。
假定你有一個server,該server有下面IP地址和域名:
??333.444.555.666
??127.0.0.1
??www.blah.com
??www.blah.net
??www.blah.org
假定你又一個webapp叫做blah.war,你希望上面的地址和域名都能被路徑"/blah"服務,以下就是你須要的在上下文XML文件里的配置:
xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/blah</Set> <Set name="war"><Property name="jetty.webapps"/>/webapps/blah.war</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>333.444.555.666</Item> <Item>127.0.0.1</Item> <Item>www.blah.com</Item> <Item>www.blah.net</Item> <Item>www.blah.org</Item> </Array> </Set> </Configure>
為不同的上下文配置不同的虛擬主機集合
你能為不同的上下文配置不同的虛擬主機集合。比如,假定你的足跡有以下的域名:
??www.blah.com
??www.blah.net
??www.blah.org
??www.other.com
??www.other.net
??www.other.org
假定你又兩個webapps,一個叫blah.war,你想為域名*.blah.*的請求提供服務。還有一個叫other.war。為*.other.*域名的請求提供服務。
在上下文文件里。blah的配置例如以下:
這樣,以下的url將相應到blah的上下文:
??http://www.blah.com/blah
??http://www.blah.net/blah
??http://www.blah.org/blah
而other的配置為:
> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/other</Set> <Set name="war"><Property name="jetty.webapps"/>/webapps/other.war</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>www.other.com</Item> <Item>www.other.net</Item> <Item>www.other.org</Item> </Array> </Set> </Configure>
這樣以下的url將會被other上下文處理:
??http://www.other.com/other
??http://www.other.net/other
??http://www.other.org/other
對同一個上下文路徑的不同上下文設置不同的虛擬主機集合
考慮和上面同樣的場景,我們希望blah.war相應域名*.blah.*。而other.war相應域名*.other.* 。然而。我們希望我們的client都是用上下文路徑"/"。
換句話說。我們希望以下的url匹配到blah.war:
??http://www.blah.com/
??http://www.blah.net/
??http://www.blah.org/
類似的,我們希望以下的url相應到other.war:
??http://www.other.com/
??http://www.other.net/
??http://www.other.org/
為了達到這個目地,我們須要全部的webapps都是用相同的上下文路徑"/",并能相應到不同的虛擬主機名。
以下是foo的配置:
以下是bar的配置:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"><Configure class="org.eclipse.jetty.webapp.WebAppContext"><Set name="contextPath">/</Set><Set name="war"><Property name="jetty.webapps"/>/webapps/bar.war</Set><Set name="virtualHosts"><Array type="java.lang.String"><Item>www.other.com</Item><Item>www.other.net</Item><Item>www.other.org</Item></Array></Set> </Configure>暫時目錄
Jetty本身沒有暫時目錄。可是你能為每一個web應用分配一個目錄,用于WAR的解壓、JSP的編譯等。假設你沒有分配一個暫時目錄。當你的web應用啟動時,Jetty將依照須要創建一個。
不管你是指定一個。或者讓Jetty創建一個,你都能夠選擇在web應用停止的時候是否刪除它。
默認暫時目錄
默認。Jetty將為每一個web應用創建一個暫時目錄,目錄的名字能夠是以下的形式:
?"jetty-"+host+"-"+port+"-"+resourceBase+"-_"+context+"-"+virtualhost+"-"+randomdigits+".dir"
比如:
?jetty-0.0.0.0-8080-test.war-_test-any-8900275691885214790.dir
上面表示:0.0.0.0是主機地址,8080是port,test.war是resourceBase。test是上下文路徑(/轉化為_)。any是虛擬主機。randomdigits是唯一數字串。
一旦這個暫時目錄被創建。能夠通過上下文屬性值javax.servlet.context.tempdir獲取到。
暫時目錄的位置
默認。jetty將在java.io.tmpdir系統屬性指定的目錄內創建暫時目錄,你能設置上下文屬性org.eclipse.jetty.webapp.basetempdir來指定暫時目錄的父目錄,注意這個父目錄必須存在且是可寫的。
你能在上下文文件里設置該屬性。或者通過編碼。以下是上下文文件里設置的樣例:
等效的代碼中設置的樣例:
WebAppContext context = new WebAppContext(); context.setContextPath("/test"); context.setWar("foo.war"); context.setAttribute("org.eclipse.jetty.webapp.basetempdir", "/tmp/foo");指定暫時目錄
你能有兩種方式指定暫時目錄:
WebAppContext.setTempDirectory(String dir)
以下是使用上下文文件配置:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"><Set name="contextPath">/test</Set><Set name="war">foo.war</Set><Set name="tempDirectory">/some/dir/foo</Set> </Configure>以下是使用編碼實現:
WebAppContext context = new WebAppContext(); context.setContextPath("/test"); context.setWar("foo.war"); context.setTempDirectory(new File("/some/dir/foo"));設置javax.servlet.context.tempdir context屬性
在上下文文件里配置:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"><Set name="contextPath">/test</Set><Set name="war">foo.war</Set><Call name="setAttribute"><Arg>javax.servlet.context.tempdir</Arg><Arg>/some/dir/foo</Arg></Call></Configure>使用編碼實現:
WebAppContext context = new WebAppContext(); context.setContextPath("/test"); context.setWar("foo.war"); context.setAttribute("javax.servlet.context.tempdir", "/some/dir/foo");一旦暫時目錄被創建,它的一個File實例將被保存在web應用的javax.servlet.context.tempdir屬性中。
持久化暫時目錄
默認情況下Jetty將不保留暫時目錄,假設你想保留暫時目錄。須要調用WebAppContext.setPersistTempDirectory(true)。
須要注意的是,假設你沒有指定暫時目錄。Jetty將每次都創建一個新的暫時目錄,這樣你的暫時目錄將不斷堆積。
為WebApp指定port/連接器
有時你希望從不同的port/連接器為不同的web應用提供服務,最簡單的方式就是創建多個Server實例,然而,假設上下文須要共享資源(比如數據庫、認證),或者假設web應用的port映射沒被清晰的劃分。那么能夠考慮使用命名的連接器機制。
創建多個Server實例
假設你使用編碼方式。僅僅須要創建多個Server對象,然后按須要配置就能夠了。假設你使用XML文件配置。須要設置jetty.xml的Configure元素的id域。以下是一個樣例:
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"><Configure id="OtherServer" class="org.eclipse.jetty.server.Server"><Set name="handler"><New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection"><Set name="handlers"><Array type="org.eclipse.jetty.server.Handler"><Item><New id="OtherContexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/></Item><Item><New class="org.eclipse.jetty.server.handler.DefaultHandler"/></Item></Array></Set></New></Set><Call name="addConnector"><Arg><New class="org.eclipse.jetty.server.ServerConnector"><Arg name="server"><Ref refid="OtherServer" /></Arg><Set name="port">8888</Set></New></Arg></Call><Call name="addBean"><Arg><New id="DeploymentManager" class="org.eclipse.jetty.deploy.DeploymentManager"><Set name="contexts"><Ref refid="OtherContexts" /></Set><Call id="webappprovider" name="addAppProvider"><Arg><New class="org.eclipse.jetty.deploy.providers.WebAppProvider"><Set name="monitoredDirName"><Property name="jetty.home" default="." />/other-webapps</Set><Set name="defaultsDescriptor"><Property name="jetty.home" default="." />/etc/webdefault.xml</Set><Set name="configurationManager"><New class="org.eclipse.jetty.deploy.PropertiesConfigurationManager"/></Set></New></Arg></Call></New></Arg></Call> </Configure>?1)改變id="Server"到一個新的server名:<Configure id="OtherServer" class="org.eclipse.jetty.server.Server"> ;
?2)改變連接器的server參數的refid到新的server:<Arg name="server"><Ref refid="OtherServer" /></Arg>;
?3)確保全部對jetty.port屬性的引用都被重命名或者使用新值;
?4)確保全部部署器的AppProvider引用的”webapps“相應到不同的應用。
為了執行otherServer。添加配置文件到命令行:
??java -jar start.jar jetty-otherserver.xml
命名的連接器
能夠使用一個對虛擬主機機制的擴展。即命名的連接器,來確保一些web應用僅被特定的連接器處理。
假設一個連接器有一個名字”MyConnector“,用setName方法設置,那么這能相應到特定的虛擬主機名”@MyConnector“。
創建自己定義error頁
以下將介紹幾個方法在Jetty中自己定義error頁。
在web.xml中定義error頁
你能用標準webapp配置文件webapp/WEB-INF/web.xml的error-page元素映射errors到指定的URLs。這個原書創建了一個在error-code或exception-type到資源location的映射關系。
??error-code:整數值(integer)
??exception-type:一個Java異常的類名
??location:相對于web應用的root的資源位置,以"/"開始
error code的樣例:
異常的樣例:
<error-page><exception-type>java.io.IOException</exception-type><location>/jspsnoop/IOException</location> </error-page>這個映射將導致請求重定向到一個通常的URL,將被作為一個通常的請求進行處理。因此請求的對象可能為靜態資源、一個JSP或一個filter和/或servlet。
當處理一個由錯誤重定向產生的請求時。以下的請求屬性被設置。并在生成動態頁時可用:
?1)javax.servlet.error.exception
?導致error(或null)的異常實例
?2)javax.servlet.error.exception_type
?導致error(或null)的異常實例的類名
?3)javax.servlet.error.message
?錯誤信息
?4)javax.servlet.error.request_uri
?出錯請求的URI
?5)javax.servlet.error.servlet_name
?出錯請求被分發到的servlet的Servlet名
?6)javax.servlet.error.status_code
?錯誤的狀態碼(比如:404,500等)
配置error頁上下文文件
你能用上下文IoC XML 文件配置默認error頁,這樣做的優點是比web.xml中配置更加靈活,特別在須要error code范圍支持時。上下文文嘉通常在${jetty.home}/webapps/,以下是一個樣例:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.eclipse.org/configure.dtd"><Configure class="org.eclipse.jetty.webapp.WebAppContext"><Set name="contextPath">/test</Set><Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test</Set><!-- by Code --><Get name="errorHandler"><Call name="addErrorPage"><Arg type="int">404</Arg><Arg type="String">/jspsnoop/ERROR/404</Arg></Call></Get><!-- by Exception --><Get name="errorHandler"><Call name="addErrorPage"><Arg><Call class="java.lang.Class" name="forName"><Arg type="String">java.io.IOException</Arg></Call></Arg><Arg type="String">/jspsnoop/IOException</Arg></Call></Get><!-- by Code Range --><Get name="errorHandler"><Call name="addErrorPage"><Arg type="int">500</Arg><Arg type="int">599</Arg><Arg type="String">/dump/errorCodeRangeMapping</Arg></Call></Get> </Configure>自己定義ErrorHandler類
假設沒有error頁映射被定義,或者假設error頁資源自身發生了錯誤。那么error頁將通過ErrorHandler的一個實例產生,ErrorHandler通過Context或者Server配置。
ErrorHandler能實現以下的部分或全部方法:
void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException void handleErrorPage(HttpServletRequest request, Writer writer, int code, String message) throws IOException void writeErrorPage(HttpServletRequest request, Writer writer, int code, String message, boolean showStacks) throws IOException void writeErrorPageHead(HttpServletRequest request, Writer writer, int code, String message) throws IOException void writeErrorPageBody(HttpServletRequest request, Writer writer, int code, String message, boolean showStacks) throws IOException void writeErrorPageMessage(HttpServletRequest request, Writer writer, int code, String message, String uri) throws IOException void writeErrorPageStacks(HttpServletRequest request, Writer writer) throws IOException一個ErrorHandler實例可以調用ContextHandler.setErrorHandler設置,能通過編碼或者上下文IoC XML實現,比如:
<Configure class="org.eclipse.jetty.server.handler.ContextHandler">...<Set name="errorHandler"><New class="com.acme.handler.MyErrorHandler"/></Set>...</Configure> ErrorHandler實例也能夠作為一個bean加入到Server實例中,能通過編碼調用Server.addBean(Object)實現,或者在jetty.xml中配置:<Configure id="Server" class="org.eclipse.jetty.server.Server">...<Call name="addBean"><Arg><New class="com.acme.handler.MyErrorHandler"/></Arg></Call>...</Configure>設置最大窗口大小
Jetty限制來自瀏覽器或者其他client發送到服務端的數據大小。這有利于防止惡意用戶的攻擊。通過送大量的數據到服務端。Jetty同意的默認最大值是200000bytes。你能改變這個默認值,為特定的webapp、或者在一個特定Server實例的全部webapp、或者在同樣JVM下的全部webapp。
為單個webapp
調用方法為:ContextHandler.setMaxFormContentSize(int maxSize);
你能夠在webapp的上下文XML部署描寫敘述符文件里設置,或者在jetty-web.xml文件(在webapp的WEB-INF文件夾下)中設置,設置的語法同樣:
為同樣Server的全部WebApp
以下是詳細的樣例:
<Configure class="org.eclipse.jetty.server.Server"><Call name="setAttribute"><Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg><Arg>200000</Arg></Call> </Configure>為同樣JVM下的全部WebApp
用系統屬性org.eclipse.jetty.server.Request.maxFormContentSize。能通過命令行指定。或者在start.ini文件里設置。
轉載于:https://www.cnblogs.com/yfceshi/p/7340870.html
總結
以上是生活随笔為你收集整理的Jetty:配置上下文的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 22)PHP,数组排序函数
- 下一篇: hdu 6106 Classes