Создание необязательных параметров пути в конечных точках WebSocket в Java EE

Учитывая конечную точку WebSocket следующим образом.

@ServerEndpoint(value = "/Push/CartPush/{token}")
public final class CartPush {
    // ...
}

Конечная точка может принимать параметр пути {token}. Однако параметр пути является необязательным, который определяется динамически во время выполнения в Java Script. Пропуск этого параметра в JavaScript, как показано ниже, приводит к 404.

var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush");

Ошибка подключения WebSocket к 'wss://localhost:8443/ContextPath/Push/CartPush': ошибка во время рукопожатия WebSocket: неожиданный код ответа: 404

Это делает значение токена обязательным следующим образом.

var token = "token value";
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush" + "/" + token);

Чтобы исключить все ненужные методы HTTP, кроме GET и POST, я использую следующие ограничения или ограничения вместе с ограничениями безопасности сервлета, используя соответствующие шаблоны URL и сопоставления ролей в web.xml.

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Disable unneeded HTTP methods by 403</web-resource-name>

        <url-pattern>/Public/*</url-pattern>
        <url-pattern>/Push/*</url-pattern>
        <url-pattern>/javax.faces.resource/*</url-pattern>

        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
</security-constraint>

<deny-uncovered-http-methods/> <!-- Requires Servlet 3.1 -->

Как сделать данный параметр пути необязательным?

Используется сервер WildFly 10.0.0 final / Java EE 7.


person Tiny    schedule 03.03.2016    source источник
comment
Интересно, какое отношение ограничение безопасности имеет к конкретному вопросу. Вопрос останется в силе, если вы опустите его.   -  person BalusC    schedule 04.03.2016
comment
Я добавил этот раздел в качестве дополнительной информации, потому что GlassFish (4.1) будет работать с такими URI, как /Push/CartPush, даже если <url-pattern>/Push/*</url-pattern> будет исключено или удалено из web.xml. WildFly, с другой стороны, сообщал бы 403 с /Push/CartPush, когда этот <url-pattern> был исключен из web.xml. Я не знаю причины.   -  person Tiny    schedule 04.03.2016


Ответы (1)


К сожалению, шаблон WS URI задокументирован, чтобы следовать шаблонам RFC 6570 Level 1. Таким образом, шаблон уровня 3, такой как /Push/CartPush{/token}, не сработает.

Лучше всего всегда добавлять к нему суффикс / и пусть токен будет пустой строкой.

var token = "";
var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush/" + token);

Возможно, стоит отправить запрос на улучшение по адресу специалистам по спецификациям WS.

Учитывая, что параметр полностью определен в клиенте, альтернативой является предоставление его в качестве параметра запроса. Естественно, параметры запроса представляют собой параметры, определяемые клиентом.

var ws = new WebSocket("wss://localhost:8443/ContextPath/Push/CartPush?token=" + token);

String token = session.getRequestParameterMap().get("token").get(0);
person BalusC    schedule 03.03.2016