gpt4 book ai didi

java - @MessageMapping 不适用于 Spring Security 和 MVC

转载 作者:行者123 更新时间:2023-11-30 07:56:12 25 4
gpt4 key购买 nike

我有一个使用 Spring MVC 和安全性的应用程序。我尝试向其中添加 Websockets。我已经成功连接,但是,当我尝试向后端发送消息时 - 没有任何反应。在 Debug模式下,用@MessageMapping 注释的方法根本无法到达!我不知道为什么。我已经尝试了很多 Google 解决方案,所以现在所有配置都是下一步:

@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();
}
}

我还为 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 类

@Controller
public class WebsocketController {

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

}
}

socket.js,导入JSP文件

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

spring-security.xml(进一步导入主spring.xml)

<?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>

浏览器日志:

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

有人知道我做错了什么吗?

第 1 版顺便说一下,当我在简单的项目中使用这个配置时,没有 Spring-Security 一切正常!

最佳答案

所以,我找到了解决方案!错误很简单。我的 WebSocketConfig 是由 IoC 上下文初始化的,而不是 MVC。我将它移动到由 MVC 上下文扫描的包中,一切都开始完美运行!如果有人有同样的情况,请确定您的 Web 套接字配置类正在由 MVC 上下文初始化。

关于java - @MessageMapping 不适用于 Spring Security 和 MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42441837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com