Polish
This commit is contained in:
@@ -38645,11 +38645,10 @@ for purging inactive destinations.
|
||||
|
||||
|
||||
[[websocket-stomp-appplication-context-events]]
|
||||
==== Broker events and message interception
|
||||
==== Listening To ApplicationContext Events and Intercepting Messages
|
||||
|
||||
The STOMP messaging support publishes the `ApplicationContext` events listed below.
|
||||
To subscribe to receive one or more of these events a Spring managed component can
|
||||
implement Spring's `ApplicationListener` interface. The events are:
|
||||
Several `ApplicationContext` events (listed below) are published and can be
|
||||
received by implementing Spring's `ApplicationListener` interface.
|
||||
|
||||
* `BrokerAvailabilityEvent` -- indicates when the broker becomes available/unavailable.
|
||||
While the "simple" broker becomes available immediately on startup and remains so while
|
||||
@@ -38686,33 +38685,9 @@ will typically notice the broker is not responding within 10 seconds. Clients ne
|
||||
implement their own reconnect logic.
|
||||
====
|
||||
|
||||
An application can also intercept all incoming or outgoing messages by creating a
|
||||
`ChannelInterceptor` and registering it on the inbound or outbound channel. See bellow
|
||||
an example that filters messages based on the message destination and user:
|
||||
|
||||
[source,java,indent=0]
|
||||
[subs="verbatim,quotes"]
|
||||
----
|
||||
public class AccessControlChannelInterceptor extends ChannelInterceptorAdapter {
|
||||
|
||||
@Override
|
||||
public Message<?> preSend(Message<?> message, MessageChannel channel) {
|
||||
Principal user = SimpMessageHeaderAccessor.getUser(message.getHeaders());
|
||||
String destination = SimpMessageHeaderAccessor.getDestination(message.getHeaders());
|
||||
if(isAllowed(destination, user)) {
|
||||
return message;
|
||||
}
|
||||
throw new AccessControlException("Message to destination " + destination
|
||||
+ " not allowed for user " + user.getName());
|
||||
}
|
||||
|
||||
private boolean isAllowed(String destination, Principal user) {
|
||||
// ...
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
In Java config:
|
||||
Furthermore, an application can directly intercept every incoming and outgoing message by
|
||||
registering a `ChannelInterceptor` on the respective message channel. For example
|
||||
to intercept inbound messages:
|
||||
|
||||
[source,java,indent=0]
|
||||
[subs="verbatim,quotes"]
|
||||
@@ -38721,49 +38696,34 @@ In Java config:
|
||||
@EnableWebSocketMessageBroker
|
||||
public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
|
||||
|
||||
// ...
|
||||
|
||||
@Override
|
||||
public void configureClientInboundChannel(ChannelRegistration registration) {
|
||||
registration.setInterceptors(myInterceptor());
|
||||
registration.setInterceptors(new MyChannelInterceptor());
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AccessControlChannelInterceptor myInterceptor() {
|
||||
return new AccessControlChannelInterceptor();
|
||||
}
|
||||
|
||||
}
|
||||
----
|
||||
|
||||
Or in XML config:
|
||||
A custom `ChannelInterceptor` can extend the empty method base class
|
||||
`ChannelInterceptorAdapter` and use `StompHeaderAccessor` or `SimpMessageHeaderAccessor`
|
||||
to access information about the message.
|
||||
|
||||
[source,xml,indent=0]
|
||||
[subs="verbatim,quotes,attributes"]
|
||||
[source,java,indent=0]
|
||||
[subs="verbatim,quotes"]
|
||||
----
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:websocket="http://www.springframework.org/schema/websocket"
|
||||
xsi:schemaLocation="
|
||||
http://www.springframework.org/schema/beans
|
||||
http://www.springframework.org/schema/beans/spring-beans.xsd
|
||||
http://www.springframework.org/schema/websocket
|
||||
http://www.springframework.org/schema/websocket/spring-websocket.xsd">
|
||||
public class MyChannelInterceptor extends ChannelInterceptorAdapter {
|
||||
|
||||
<websocket:message-broker application-destination-prefix="/app">
|
||||
<websocket:stomp-endpoint path="/foo"/>
|
||||
<websocket:simple-broker prefix="/topic"/>
|
||||
<websocket:client-inbound-channel>
|
||||
<websocket:interceptors>
|
||||
<bean id="myInterceptor" class="com.foo.AccessControlChannelInterceptor" />
|
||||
</websocket:interceptors>
|
||||
</websocket:client-inbound-channel>
|
||||
</websocket:message-broker>
|
||||
|
||||
</beans>
|
||||
@Override
|
||||
public Message<?> preSend(Message<?> message, MessageChannel channel) {
|
||||
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
|
||||
StompCommand command = accessor.getStompCommand();
|
||||
// ...
|
||||
return message;
|
||||
}
|
||||
}
|
||||
----
|
||||
|
||||
|
||||
|
||||
[[websocket-stomp-websocket-scope]]
|
||||
==== WebSocket Scope
|
||||
|
||||
|
||||
Reference in New Issue
Block a user