【问题标题】:Spring Websockets based on XML and based on Annotations基于 XML 和 Annotations 的 Spring Websockets
【发布时间】:2018-10-05 04:22:30
【问题描述】:

我正在尝试在 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.xmlroot-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

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

    你可以很好地做这样的事情

    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");
    
        }
    
    
    }
    

    【讨论】:

    • 非常感谢!这就是我一直在寻找的。所以,在你编辑之后,我可以删除 web.xml、root-context、security-context、servlet-context,不是吗?或者我应该将代码从这些 xml 移动到另一个带注释的配置 java 类?
    • 您的问题是针对 Web 套接字部分,因此仅从 xml 中删除代码的 Web 套接字部分
    【解决方案2】:

    你可以在 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;
            }
        }
    

    【讨论】:

    • 谢谢!这是非常明确的信息!但是....您的示例只有 websocket 实现部分。没有 SpringSecurity。但是在我的代码中,我有 Spring Security 授权(但只是,它在 xml 中很糟糕)。那么,我如何在你的代码中添加 SpringSecurity 功能......也许你在网上看到了一些例子......)
    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多