本文主要講述如何使用嵌入式jetty,創建http/https服務器.
一. 相關jar包
Jetty-server
Jetty-servlet
二.創建方式
2.1)最簡單的
Server server = new Server(8080);
server.start();
server.join();
創建一個jetty server,并啟動,這樣我們就創建了一個最簡單的http服務器,檢查8080端口為監聽狀態, 但是很明顯,該服務器不會對客戶端請求有任何響應.
2.2) HANDLER
1)實現
從實現上來看, jetty server本身就是一個HandlerWrapper, 可以通過為server設置handler,處理客戶端的請求.
Server server = new Server(8080);
server.setHandler(new HelloHandler());
server.start();
server.join();
通過擴展AbstractHandler類, 實現handle方法, 定義用戶自己的handler, 例如:
public class HelloHandler extends AbstractHandler {
public void handle(String target, Request baseRequest,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
response.getWriter().println("</pre><h1>Hello World</h1><pre>");
}
}
2)測試
瀏覽器上輸入:
http://localhost:8080 輸出:
<h1>Hello World</h1> 2.3) SERVLET
直接為Server設置Handler,我們無法針對不同的URL Path,完成不同的處理邏輯, 例如,
當瀏覽器輸入如下URL時,服務器區別處理:
http://localhost:8080/*
http://localhost:8080/TYPE1/*
http://localhost:8080/TYPE2/* 1)實現
Server添加ServletContextHandler,然后,針對不同的path, 設置對應的Servlet來處理.
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(new ServletHolder(new HelloServlet()), "/*");
context.addServlet(new ServletHolder(new HelloServlet("TYPE1 Request")), "/TYPE1/*");
context.addServlet(new ServletHolder(new HelloServlet("TYPE2 Request")), "/TYPE2/*");
server.start();
server.join();
<br />
</div>
</td>
<td>
<div class="container">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
通過擴展HttpServlet,覆蓋doPost或者doGet方法,定義用戶自己的Servlet,例如:
public class HelloServlet extends HttpServlet {
String greeting = "Hello";
public HelloServlet() {
}
public HelloServlet(String hi) {
greeting = hi;
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println("</pre><h1>” + greeting + "</h1><pre>");
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}</pre>
</span>
</div>
</div>
2)測試
瀏覽器上輸入:
http://localhost:8080/*
http://localhost:8080/TYPE1/*
http://localhost:8080/TYPE2/* </pre>
分別輸出:
<h1>Hello</h1>
<h1>TYPE1 Request</h1>
<h1>TYPE2 Request<h1> 2.3) Connector
http/https服務器也可以同時在多個端口上提供服務, 這就需要引入Connector
1)實現
如下代碼就設置了兩個Connector, 一個使用8080端口,另一個使用8888端口:
Server server = new Server();
SelectChannelConnector connector0 = new SelectChannelConnector();
connector0.setPort(8080);
connector0.setMaxIdleTime(30000);
connector0.setRequestHeaderSize(8192);
SelectChannelConnector connector1 = new SelectChannelConnector();
connector1.setPort(8888);
connector1.setMaxIdleTime(30000);
connector1.setRequestHeaderSize(8192);
server.setConnectors(new Connector[] { connector0,connector1 });
server.setHandler(new HelloHandler());
server.start();
server.join();</pre>
</div>
2)測試
瀏覽器上輸入:
http://localhost:8080/* 或者
http://localhost:8888/* 三.https服務器
本節著重講述如何創建https服務器.
3.1) KEYSTORE
使用keytool命令,創建keystore. 例如:
keytool -keystore zenithKS -alias zenith -genkey -keyalg RSA
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: zenith
What is the name of your organizational unit?
[Unknown]: zenith
What is the name of your organization?
[Unknown]: zenith
What is the name of your City or Locality?
[Unknown]: bj
What is the name of your State or Province?
[Unknown]: bj
What is the two-letter country code for this unit?
[Unknown]: cn
Is CN=zenith, OU=zenith, O=zenith, L=bj, ST=bj, C=cn correct? (type "yes" or "no")
[no]: yes
Enter key password for <zenith>:
(RETURN if same as keystore password):</pre>
需要用戶輸入keystore密碼以及key密碼,最后,會在當前目錄下生成一個zenithKS文件,這就是keystore文件
3.2) SSL CONNECTOR
為jetty Server設置ssl Connector,需要指定keystore路徑, keystore密碼以及key密碼.
Server server = new Server();
SslSelectChannelConnector ssl_connector = new SslSelectChannelConnector();
ssl_connector.setPort(8443);
SslContextFactory cf = ssl_connector.getSslContextFactory();
cf.setKeyStore("D:\\keystores\\zenithKS");
cf.setKeyStorePassword("password");
cf.setKeyManagerPassword("password");
server.addConnector(ssl_connector);
server.start();
server.join();
本文由用戶
ptjs 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
Jetty最常用的一種用法是把Jetty嵌入到自己的Java應用程序中,此時Jetty作為一個后臺的Servlet容器運行,接受用戶的http請求,下面是一個最簡單的嵌入Jetty的用法。 1....
本文主要講述如何使用嵌入式jetty,創建http/https服務器. 一.?? 相關jar包 Jetty-server Jetty-servlet 二.創建方式 2.1)最簡單的 Server...
在嵌入運行Jetty的時候,有時候想要啟動兩個端口,或者通過一個Jetty server提供多個不同服務,比如說使用8080來指定默認訪問端口,使用8433指定https訪問端口等等,此時就可以...
1. 首先修改pom.xml文件,添加spring的依賴項 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:...
sesese色