public class DefaultHandshakeHandler extends java.lang.Object implements HandshakeHandler
HandshakeHandler
implementation.
Performs initial validation of the WebSocket handshake request -- possibly rejecting it
through the appropriate HTTP status code -- while also allowing sub-classes to override
various parts of the negotiation process (e.g. origin validation, sub-protocol negotiation,
extensions negotiation, etc).
If the negotiation succeeds, the actual upgrade is delegated to a server-specific
RequestUpgradeStrategy
, which will update
the response as necessary and initialize the WebSocket. Currently supported servers are
Tomcat 7 and 8, Jetty 9, and GlassFish 4.
Modifier and Type | Field and Description |
---|---|
private static boolean |
glassFishWsPresent |
private static boolean |
jettyWsPresent |
protected Log |
logger |
private RequestUpgradeStrategy |
requestUpgradeStrategy |
private java.util.List<java.lang.String> |
supportedProtocols |
private static boolean |
tomcatWsPresent |
private static boolean |
undertowWsPresent |
Constructor and Description |
---|
DefaultHandshakeHandler()
Default constructor that autodetects and instantiates a
RequestUpgradeStrategy suitable for the runtime container. |
DefaultHandshakeHandler(RequestUpgradeStrategy requestUpgradeStrategy)
A constructor that accepts a runtime-specific
RequestUpgradeStrategy . |
Modifier and Type | Method and Description |
---|---|
protected java.util.List<java.lang.String> |
determineHandlerSupportedProtocols(WebSocketHandler handler)
Determine the sub-protocols supported by the given WebSocketHandler by checking
whether it is an instance of
SubProtocolCapable . |
protected java.security.Principal |
determineUser(ServerHttpRequest request,
WebSocketHandler wsHandler,
java.util.Map<java.lang.String,java.lang.Object> attributes)
A method that can be used to associate a user with the WebSocket session
in the process of being established.
|
boolean |
doHandshake(ServerHttpRequest request,
ServerHttpResponse response,
WebSocketHandler wsHandler,
java.util.Map<java.lang.String,java.lang.Object> attributes)
Initiate the handshake.
|
protected java.util.List<WebSocketExtension> |
filterRequestedExtensions(ServerHttpRequest request,
java.util.List<WebSocketExtension> requested,
java.util.List<WebSocketExtension> supported)
Filter the list of requested WebSocket extensions.
|
java.lang.String[] |
getSupportedProtocols()
Return the list of supported sub-protocols.
|
protected java.lang.String[] |
getSupportedVersions() |
protected void |
handleInvalidConnectHeader(ServerHttpRequest request,
ServerHttpResponse response) |
protected void |
handleInvalidUpgradeHeader(ServerHttpRequest request,
ServerHttpResponse response) |
protected void |
handleWebSocketVersionNotSupported(ServerHttpRequest request,
ServerHttpResponse response) |
private static RequestUpgradeStrategy |
initRequestUpgradeStrategy() |
protected boolean |
isValidOrigin(ServerHttpRequest request) |
protected boolean |
isWebSocketVersionSupported(WebSocketHttpHeaders httpHeaders) |
protected java.lang.String |
selectProtocol(java.util.List<java.lang.String> requestedProtocols,
WebSocketHandler webSocketHandler)
Perform the sub-protocol negotiation based on requested and supported sub-protocols.
|
void |
setSupportedProtocols(java.lang.String... protocols)
Use this property to configure the list of supported sub-protocols.
|
protected Log logger
private static final boolean glassFishWsPresent
private static final boolean jettyWsPresent
private static final boolean tomcatWsPresent
private static final boolean undertowWsPresent
private final RequestUpgradeStrategy requestUpgradeStrategy
private final java.util.List<java.lang.String> supportedProtocols
public DefaultHandshakeHandler()
RequestUpgradeStrategy
suitable for the runtime container.java.lang.IllegalStateException
- if no RequestUpgradeStrategy
can be found.public DefaultHandshakeHandler(RequestUpgradeStrategy requestUpgradeStrategy)
RequestUpgradeStrategy
.requestUpgradeStrategy
- the upgrade strategy to useprivate static RequestUpgradeStrategy initRequestUpgradeStrategy()
public void setSupportedProtocols(java.lang.String... protocols)
Note that if the WebSocketHandler passed in at runtime is an instance of
SubProtocolCapable
then there is not need to explicitly configure
this property. That is certainly the case with the built-in STOMP over
WebSocket support. Therefore this property should be configured explicitly
only if the WebSocketHandler does not implement SubProtocolCapable
.
public java.lang.String[] getSupportedProtocols()
public final boolean doHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, java.util.Map<java.lang.String,java.lang.Object> attributes) throws HandshakeFailureException
HandshakeHandler
doHandshake
in interface HandshakeHandler
request
- the current requestresponse
- the current responsewsHandler
- the handler to process WebSocket messages; see
PerConnectionWebSocketHandler
for providing a handler with
per-connection lifecycle.attributes
- attributes from the HTTP handshake to associate with the WebSocket
session; the provided attributes are copied, the original map is not used.HandshakeFailureException
- thrown when handshake processing failed to
complete due to an internal, unrecoverable error, i.e. a server error as
opposed to a failure to successfully negotiate the handshake.protected void handleInvalidUpgradeHeader(ServerHttpRequest request, ServerHttpResponse response) throws java.io.IOException
java.io.IOException
protected void handleInvalidConnectHeader(ServerHttpRequest request, ServerHttpResponse response) throws java.io.IOException
java.io.IOException
protected boolean isWebSocketVersionSupported(WebSocketHttpHeaders httpHeaders)
protected java.lang.String[] getSupportedVersions()
protected void handleWebSocketVersionNotSupported(ServerHttpRequest request, ServerHttpResponse response)
protected boolean isValidOrigin(ServerHttpRequest request)
protected java.lang.String selectProtocol(java.util.List<java.lang.String> requestedProtocols, WebSocketHandler webSocketHandler)
SubProtocolCapable
and then also checks if any
sub-protocols have been explicitly configured with
setSupportedProtocols(String...)
.requestedProtocols
- the requested sub-protocolswebSocketHandler
- the WebSocketHandler that will be usednull
determineHandlerSupportedProtocols(org.springframework.web.socket.WebSocketHandler)
protected final java.util.List<java.lang.String> determineHandlerSupportedProtocols(WebSocketHandler handler)
SubProtocolCapable
.handler
- the handler to checkprotected java.util.List<WebSocketExtension> filterRequestedExtensions(ServerHttpRequest request, java.util.List<WebSocketExtension> requested, java.util.List<WebSocketExtension> supported)
By default all request extensions are returned. The WebSocket server will further compare the requested extensions against the list of supported extensions and return only the ones that are both requested and supported.
request
- the current requestrequested
- the list of extensions requested by the clientsupported
- the list of extensions supported by the serverprotected java.security.Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, java.util.Map<java.lang.String,java.lang.Object> attributes)
ServerHttpRequest.getPrincipal()
Sub-classes can provide custom logic for associating a user with a session, for example for assigning a name to anonymous users (i.e. not fully authenticated).
request
- the handshake requestwsHandler
- the WebSocket handler that will handle messagesattributes
- handshake attributes to pass to the WebSocket sessionnull