Spring Websockets на основе XML и на основе аннотаций - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь написать собственный чат на websocket + spring security + springBoot.Теперь у меня есть в моем проекте:

Security-context.xml:

    ...
            <intercept-url pattern="/login/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
            <intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
            <intercept-url pattern="/**" access="ROLE_USER" />
            <form-login/>
        </http>

        <authentication-manager>
            <authentication-provider>
                <user-service>
                    <user name="bob" password="test" authorities="ROLE_USER"/>
                    <user name="jim" password="test" authorities="ROLE_USER"/>
                    <user name="a" password="1" authorities="ROLE_USER"/>
...

servlet-context.xml

<context:annotation-config/>
    <context:component-scan base-package="wsproblem" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <mvc:annotation-driven />
    <mvc:resources mapping="/resources/**" location="/resources/" />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <websocket:message-broker application-destination-prefix="/app">
        <websocket:stomp-endpoint path="/ws">
            <websocket:sockjs />
        </websocket:stomp-endpoint>
        <websocket:simple-broker prefix="/topic, /user" />
    </websocket:message-broker>

, у меня есть стандартные web.xml и root-context.xml .

Также у меня есть простой контроллер :

@Controller
@RequestMapping("/")
public class HomeController {
    @Autowired private SimpMessagingTemplate simpMessagingTemplate;

    @RequestMapping(method = RequestMethod.GET)
    public String home() {
        return "home";
    }

    @MessageMapping("/greeting")
    public void greeting(Principal principal) {
        String reply = "hello " + principal.getName();
        System.out.println("sending " + reply);
        simpMessagingTemplate.convertAndSendToUser(principal.getName(), "/reply", reply);
    }

И мой вопрос :

Как переписать этот код (например, как выполнить миграцию) из xml в аннотированные файлы классов Java, такие как WebSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы можете найти работающий проект на github.https://github.com/tanoliusman/UrlShortener

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic");
    config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/gs-guide-websocket").withSockJS();
}

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> arg0) {
    // TODO Auto-generated method stub

}

@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> arg0) {
    // TODO Auto-generated method stub

}

@Override
public void configureClientInboundChannel(ChannelRegistration arg0) {
    // TODO Auto-generated method stub

}

@Override
public void configureClientOutboundChannel(ChannelRegistration arg0) {
    // TODO Auto-generated method stub

}

@Override
public boolean configureMessageConverters(List<MessageConverter> arg0) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public void configureWebSocketTransport(WebSocketTransportRegistration arg0) {
    // TODO Auto-generated method stub

}

}

function connect() {
        var socket = new SockJS('/gs-guide-websocket');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/greetings', function (greeting) {
                showGreeting(greeting.body);
            });
        });
    }
    function disconnect() {
        if (stompClient !== null) {
            stompClient.disconnect();
        }
        setConnected(false);
        console.log("Disconnected");
    }
    function sendName() {
        stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
    }
    function showGreeting(message) {
        var object = jQuery.parseJSON( message).name;
        if(object == url){
            value = 1;
        }
    }
0 голосов
/ 03 октября 2018

Вы можете очень хорошо сделать что-то вроде этого

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    private static final Logger logger = LoggerFactory.getLogger(WebSocketConfig.class);

    public WebSocketConfig(){
        logger.info("---WebSocket---");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/temp-ws").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/temp-web");
        registry.enableSimpleBroker("/queue");   // Enables a simple in-memory broker

        // rabbitmq broker
//        registry.enableStompBrokerRelay("/topic", "/queue")
//                .setRelayHost("localhost")
//                .setRelayPort(61613)
//                .setClientLogin("guest")
//                .setClientPasscode("guest");

    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...