2015-09-25 3 views
0

У меня есть Jetty WebServlet, который может соединяться с различными клиентами, написанными на C# и на Android. В настоящее время это работает с использованием простого HTTP, но я заинтересован в его обновлении до HTTPS. Чтобы сделать это, я создаю такой сервер:Как правильно заставить Jetty WebSocketServlet работать с HTTPS?

public static void main(String[] args){ 

    SslContextFactory contextFactory = new SslContextFactory(); 
    contextFactory.setKeyStorePath("keystore.jks"); 
    contextFactory.setKeyStorePassword("********"); 
    SslConnectionFactory connectionFactory = new SslConnectionFactory(contextFactory, org.eclipse.jetty.http.HttpVersion.HTTP_2_0.toString()); 

    Server server = new Server(8080); 

    ServerConnector connector = new ServerConnector(server, connectionFactory); 
    connector.setPort(8443); 
    server.addConnector(connector); 

    ServletContextHandler servletCH = new ServletContextHandler(); 
    servletCH.setContextPath("/"); 
    servletCH.addServlet(ScheduleWebSocketServlet.class, "/schedule"); 

    server.setHandler(servletCH); 

    server.start(); 
    server.join(); 


} 

Это кажется неправильным. Класс ScheduleWebSocketServlet выглядит следующим образом:

@WebServlet(name = "Schedule WebSocketServlet", urlPatterns = {"/schedule"}) 
public static class ScheduleWebSocketServlet extends WebSocketServlet{ 

    private static final long serialVersionUID = 5838283767965540728L; 

    public void doGet(HttpServletRequest request, HttpServletResponse response){ 
     try { 
      response.getWriter().println("<h1>Hello World</h1>"); 
     } catch (IOException e) { 
      Main.LogError(e); 
     } 
    } 

    @Override 
    public void configure(WebSocketServletFactory arg0) { 
     arg0.register(ScheduleWebSocket.class); 
    } 

} 

Так что мой вопрос, что это правильный способ использовать WebServlet с HTTPS?

Большое спасибо за помощь

+0

Это возможно, и задокументированы в [различных] (http://stackoverflow.com/a/29829926/ 775715) stackoverflow [ответы] (http://stackoverflow.com/a/29280145/775715). Какую ошибку вы видите? –

+0

Я не вижу никаких ошибок. Я пытаюсь настроить HTTPS с помощью WebSocketServlet, но делаю это неправильно. Если бы кто-то мог предоставить простой пример HTTPS, совместимый с WebSocketServlets, это помогло бы мне и другим, у кого может быть такая же установка в будущем. – Stromata

ответ

0

Ok так что моя проблема оказалась в том, что я должен был создать ServerConnections с конфигурациями для HTTP и HTTPS, дать им информацию и назначить их на сервер. После всего этого мне просто нужно, чтобы начать их, что должно быть сделано после того, как сервер запущен

Server server = new Server(); 

    HttpConfiguration http_config = new HttpConfiguration(); 
    http_config.setSecureScheme("https"); 
    http_config.setSecurePort(8443); 
    http_config.setOutputBufferSize(32768); 

    HttpConfiguration https_config = new HttpConfiguration(); 
    https_config.addCustomizer(new SecureRequestCustomizer()); 

    ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(http_config)); 
    http.setPort(8080); 
    http.setIdleTimeout(30000); 

    SslContextFactory contextFactory = new SslContextFactory(); 
    contextFactory.setKeyStorePath("keystore.jks"); 
    contextFactory.setKeyStorePassword("changeit"); 
    SslConnectionFactory connectionFactory = new SslConnectionFactory(contextFactory, org.eclipse.jetty.http.HttpVersion.HTTP_1_1.toString()); 

    ServerConnector https = new ServerConnector(server, connectionFactory, new HttpConnectionFactory(https_config)); 
    https.setPort(8443); 
    https.setIdleTimeout(50000); 

    server.setConnectors(new Connector[]{http, https}); 

    ServletContextHandler servletCH = new ServletContextHandler(); 
    servletCH.setContextPath("/"); 
    servletCH.addServlet(ScheduleWebSocketServlet.class, "/schedule"); 

    server.setHandler(servletCH); 

    server.start(); 
    http.start(); 
    https.start(); 
    server.join(); 
Смежные вопросы