View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.embedded;
20  
21  import java.io.File;
22  import java.io.FileNotFoundException;
23  
24  import org.eclipse.jetty.http.HttpVersion;
25  import org.eclipse.jetty.server.Connector;
26  import org.eclipse.jetty.server.HttpConfiguration;
27  import org.eclipse.jetty.server.HttpConnectionFactory;
28  import org.eclipse.jetty.server.SecureRequestCustomizer;
29  import org.eclipse.jetty.server.Server;
30  import org.eclipse.jetty.server.ServerConnector;
31  import org.eclipse.jetty.server.SslConnectionFactory;
32  import org.eclipse.jetty.util.ssl.SslContextFactory;
33  
34  /**
35   * A Jetty server with multiple connectors.
36   */
37  public class ManyConnectors
38  {
39      public static void main( String[] args ) throws Exception
40      {
41          // Since this example shows off SSL configuration, we need a keystore
42          // with the appropriate key. These lookup of jetty.home is purely a hack
43          // to get access to a keystore that we use in many unit tests and should
44          // probably be a direct path to your own keystore.
45  
46          String jettyDistKeystore = "../../jetty-distribution/target/distribution/demo-base/etc/keystore";
47          String keystorePath = System.getProperty(
48                  "example.keystore", jettyDistKeystore);
49          File keystoreFile = new File(keystorePath);
50          if (!keystoreFile.exists())
51          {
52              throw new FileNotFoundException(keystoreFile.getAbsolutePath());
53          }
54  
55          // Create a basic jetty server object without declaring the port. Since
56          // we are configuring connectors directly we'll be setting ports on
57          // those connectors.
58          Server server = new Server();
59  
60          // HTTP Configuration
61          // HttpConfiguration is a collection of configuration information
62          // appropriate for http and https. The default scheme for http is
63          // <code>http</code> of course, as the default for secured http is
64          // <code>https</code> but we show setting the scheme to show it can be
65          // done. The port for secured communication is also set here.
66          HttpConfiguration http_config = new HttpConfiguration();
67          http_config.setSecureScheme("https");
68          http_config.setSecurePort(8443);
69          http_config.setOutputBufferSize(32768);
70  
71          // HTTP connector
72          // The first server connector we create is the one for http, passing in
73          // the http configuration we configured above so it can get things like
74          // the output buffer size, etc. We also set the port (8080) and
75          // configure an idle timeout.
76          ServerConnector http = new ServerConnector(server,
77                  new HttpConnectionFactory(http_config));
78          http.setPort(8080);
79          http.setIdleTimeout(30000);
80  
81          // SSL Context Factory for HTTPS
82          // SSL requires a certificate so we configure a factory for ssl contents
83          // with information pointing to what keystore the ssl connection needs
84          // to know about. Much more configuration is available the ssl context,
85          // including things like choosing the particular certificate out of a
86          // keystore to be used.
87          SslContextFactory sslContextFactory = new SslContextFactory();
88          sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath());
89          sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
90          sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
91  
92          // HTTPS Configuration
93          // A new HttpConfiguration object is needed for the next connector and
94          // you can pass the old one as an argument to effectively clone the
95          // contents. On this HttpConfiguration object we add a
96          // SecureRequestCustomizer which is how a new connector is able to
97          // resolve the https connection before handing control over to the Jetty
98          // Server.
99          HttpConfiguration https_config = new HttpConfiguration(http_config);
100         SecureRequestCustomizer src = new SecureRequestCustomizer();
101         src.setStsMaxAge(2000);
102         src.setStsIncludeSubDomains(true);
103         https_config.addCustomizer(src);
104 
105         // HTTPS connector
106         // We create a second ServerConnector, passing in the http configuration
107         // we just made along with the previously created ssl context factory.
108         // Next we set the port and a longer idle timeout.
109         ServerConnector https = new ServerConnector(server,
110             new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
111                 new HttpConnectionFactory(https_config));
112         https.setPort(8443);
113         https.setIdleTimeout(500000);
114 
115         // Here you see the server having multiple connectors registered with
116         // it, now requests can flow into the server from both http and https
117         // urls to their respective ports and be processed accordingly by jetty.
118         // A simple handler is also registered with the server so the example
119         // has something to pass requests off to.
120 
121         // Set the connectors
122         server.setConnectors(new Connector[] { http, https });
123 
124         // Set a handler
125         server.setHandler(new HelloHandler());
126 
127         // Start the server
128         server.start();
129         server.join();
130     }
131 }