только веб-сервер Jetty - без http-сервера - удалить ошибку 404

Я реализовал небольшой сервер веб-сокетов, используя причал, встроенный в более крупное java-приложение. Сервер работает на порту 8081, и все работает нормально (проверено на маленьком клиенте в гугл хром). Однако, если я попытаюсь получить доступ к http://localhost:8081 (да, через http), я получу ошибку 404, основанную на причал.

Есть ли способ в причале определить, основан ли полученный формат на формате веб-сокетов, а если нет (в нашем случае http), просто закрыть соединение сокета и никогда не возвращать ошибку 404?

Спасибо


person Doua Beri    schedule 24.10.2011    source источник


Ответы (2)


Вы можете сделать это самостоятельно, но я не думаю, что в Jetty есть что-то для этого.

Если вы используете WebSocketServlet, вы должны переопределить метод service, чтобы он выглядел примерно так

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
  if(!"WebSocket".equals(request.getHeader("Upgrade")))
  {
     org.eclipse.jetty.server.Request jettyRequest =  org.eclipse.jetty.server.Request.getRequest(request);
     jettyRequest.getEndPoint().close();
     jettyRequest.setHandled(true);
  }
  else
  {
     super.service(request, response);
  }
}

Если вы развернули свой собственный обработчик, вы сможете понять, как адаптировать этот код к вашим потребностям.

person Tim    schedule 28.10.2011
comment
извините, веб-сокеты всегда будут иметь заголовок Upgrade в запросах? - person Doua Beri; 28.10.2011
comment
Да, именно так работают веб-сокеты. Они начинаются как обычные HTTP-запросы со специальным заголовком, который заставляет сервер обновлять его до веб-сокета. - person Tim; 31.10.2011

то, что предлагает Тим, это то, что WebSocketServlet уже делает. https://github.com/eclipse/jetty.project/blob/master/jetty-websocket/src/main/java/org/eclipse/jetty/websocket/WebSocketServlet.java

Просто расширьте WebSocketServlet, а затем используйте различные методы doGet, doPost, doPut для обработки HTTP-запросов. Оставьте метод service() в покое, чтобы он делал то, что ему нужно.

person Joakim Erdfelt    schedule 28.10.2011
comment
WebSocketServlet ничего подобного не делает. Duoa хочет закрывать запросы, не относящиеся к веб-сокетам, без предоставления HTTP-ответа. WebSocketServlet также обрабатывает обычные HTTP-запросы... ...обычные HTTP-запросы и предоставляет ответы 404, если ничто другое их не обрабатывает. Было бы вполне возможно переопределить doGet, doPost и т. д. и вызвать EndPoint.close() в каждом из них, но это всего лишь альтернативная (и хуже IMO) реализация моего предложения. - person Tim; 31.10.2011