1

Ich habe eine Anwendung, die Spring MVC und Security.And ich versuche, Websockets hinzufügen. Ich habe bereits eine erfolgreiche Verbindung, aber wenn ich versuche, eine Nachricht an das Backend zu senden, passiert nichts. Im Debug-Modus erreicht die mit @MessageMapping annotierte Methode gar nicht! Und ich weiß nicht warum. Ich habe versucht, schon viele Google-Lösungen, so jetzt alle Konfigurationen sind weiter:@MessageMapping funktioniert nicht mit Spring Security und MVC

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    public WebSocketConfig() { 
    } 

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

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

Auch habe ich zusätzliche Sicherheit Config für WebSockets

@Configuration 
public class SecuritySocketConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer { 

    protected boolean sameOriginDisabled() { 
     return true; 
    } 

    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) { 
     messages.simpDestMatchers("/hello1").authenticated().simpDestMatchers("/app/hello1").authenticated();//permitAll(); 

    } 
} 

Controller-Klasse

@Controller 
public class WebsocketController { 

    @MessageMapping("/hello1") 
    public void send(Message message) { 
     String name = message.getName(); 

    } 
} 

Buchse .js, das heißt, in die JSP-Datei

;(function() { 

    //init 
    $(function() { 
     $("#control_mode").change(app.page.controlCheck); 
     connect(); 
    }); 
    var stompClient = null; 


    function connect() { 
     var socket = new SockJS("http://localhost:8080/hello1"); 
     stompClient = Stomp.over(socket); 
     console.log('attempt to connect: ' +stompClient!=null); 
     console.log('session id: '+ "${pageContext.session.id}"); 

     stompClient.connect('', '', function(frame) { 
      console.log('Connected: ' + frame); 
      stompClient.subscribe('/topic/greetings/', function(result) { 
       getResult(result); 
      }); 

     }); 
    } 

    function getResult(result) { 
     var isControlable= JSON.parse(greeting.body).isControlable; 
     if (isControlable) { 
      alert('Control was already gained') 
     } else { 
      $("#control_mode").prop("checked", true); 
     } 
    } 

    app.page.controlCheck = function() { 
     stompClient.send('/app/hello1', {}, JSON.stringify({'name' : "alastor" })); 
     if (this.checked) { 
      $("#control_mode").prop("checked", !this.checked); 
     } else { 
      alert('was click for release control'); 
     } 
    }; 

    function disconnect() { 
     stompClient.disconnect(); 
     console.log("Disconnected"); 
    } 
})(); 
importieren

feder security.xml (weiter zur Haupt spring.xml Import)

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://www.springframework.org/schema/security" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security.xsd"> 

    <http pattern="/resources/**" security="none"/> 
    <http pattern="/webjars/**" security="none"/> 
    <http pattern="/rest/**" security="none"/> 
    <http pattern="/favicon.ico" security="none"/> 

    <http security="none" pattern="/pathWhereCSRFWillBeIgnored/**"/> 
    <http> 
     <intercept-url pattern="/welcome/**" access="permitAll"/> 
     <intercept-url pattern="/ajax/welcome/**" access="permitAll"/> 
     <intercept-url pattern="/ajax/**" access="permitAll"/> <!--todo for testing--> 

     <intercept-url pattern="/**" access="@validateService.isValid(request)"/> 
     <form-login login-page="/welcome" 
        authentication-failure-url="/welcome?error=true" 
        login-processing-url="/spring_security_check" 
        authentication-success-handler-ref="directLinkHandler"/> 
     <logout logout-success-url="/welcome"/> 
     <csrf disabled="true"/> 
    </http> 

    <beans:bean class="com.promptlink.stbtp.webapi.listener.AuthenticationEventListener"/> 

    <beans:bean class="com.promptlink.stbtp.service.security.util.PasswordEncoder" id="passwordEncoder"/> 

    <authentication-manager alias="authenticationManager"> 
     <authentication-provider user-service-ref="userService"> 
      <password-encoder ref="passwordEncoder"/> 
     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 

Browser-Log:

Opening Web Socket... stomp.js:134:99 
Web Socket Opened... stomp.js:134:99 
>>> CONNECT 
login: 
passcode: 
accept-version:1.1,1.0 
heart-beat:10000,10000 

stomp.js:134:99 
<<< CONNECTED 
version:1.1 
heart-beat:0,0 
user-name:qwe 

stomp.js:134:99 
connected to server undefined stomp.js:134:99 
Connected: CONNECTED 
user-name:qwe 
heart-beat:0,0 
version:1.1 

socket.js:18:13 
>>> SUBSCRIBE 
id:sub-0 
destination:/topic/greetings/ 

stomp.js:134:99 
>>> SEND 
destination:/app/hello1 
content-length:18 

{"name":"alastor"} 

Sie jemand wissen, was mache ich falsch?

AUSGABE 1 Übrigens, wenn ich diese Konfiguration im einfachen Projekt verwende, ohne Spring-Security funktioniert alles perfekt!

Antwort

1

Also, ich fand die Lösung! Der Fehler war sehr einfach. Mein WebSocketConfig wurde von IoC Kontext initialisiert, nicht MVC. Ich habe es in ein Paket verschoben, das vom MVC-Kontext gescannt wurde und alles hat perfekt funktioniert! Wenn jemand die gleiche Situation hat, sei dir sicher, dass deine Web Socket Config Klasse von MVC context initialisiert wird.

Verwandte Themen