嵌入式jetty

ptjs 12年前發布 | 858 次閱讀 FreeWAF

本文主要講述如何使用嵌入式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();

</div>

瀏覽器上輸入:

 https://localhost:8443/*

3.3)HTTPS客戶端

HttpClient提供了對SSL的支持, 以下通過擴展HttpClient類實現自動接受證書.

因為這種方法自動接收所有證書,因此存在一定的安全問題,所以在使用這種方法前請仔細考慮您的系統的安全需求。具體的步驟如下:

1) 提供一個自定義的socket factory(test.MySecureProtocolSocketFactory)。這個自定義的類必須實現接口

org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory

在實現接口 的類中調用自定義的

X509TrustManager(test.MyX509TrustManager)

這兩個類可以在隨本文帶的附件中得到

2) 創建一個org.apache.commons.httpclient.protocol.Protocol的實例,指定協議名稱和默認的端口號

Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);

3) 注冊剛才創建的https協議對象

Protocol.registerProtocol("https ", myhttps);

4) 然后按照普通編程方式打開https的目標地址

代碼下載:

source

具體請參考:

http://www.blogjava.net/happytian/archive/2007/01/18/94553.html

四.參考資料

http://download.eclipse.org/jetty/stable-7/xref/org/eclipse/jetty/embedded/package-summary.html
http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

 本文由用戶 ptjs 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
寫博客

博客分類

推薦閱讀

Jetty實戰之 嵌入式運行Jetty

Jetty最常用的一種用法是把Jetty嵌入到自己的Java應用程序中,此時Jetty作為一個后臺的Servlet容器運行,接受用戶的http請求,下面是一個最簡單的嵌入Jetty的用法。 1....

嵌入式jetty

本文主要講述如何使用嵌入式jetty,創建http/https服務器. 一.?? 相關jar包 Jetty-server Jetty-servlet 二.創建方式 2.1)最簡單的 Server...

Jetty實戰之 嵌入式運行Jetty多Connector

在嵌入運行Jetty的時候,有時候想要啟動兩個端口,或者通過一個Jetty server提供多個不同服務,比如說使用8080來指定默認訪問端口,使用8433指定https訪問端口等等,此時就可以...

Jetty實戰之 嵌入式Jetty集成Spring運行

1. 首先修改pom.xml文件,添加spring的依賴項 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:...
  • sesese色