【发布时间】:2019-03-17 16:09:51
【问题描述】:
我正在开发一个 Spring-MVC 项目,我正在使用 Spring-security 进行身份验证和授权。除此之外,我正在使用 Cometd 库通过 websockets 发送消息。在侦听器中收到消息后,当我尝试获取当前经过身份验证的用户时,它始终为空。
如何确保 Cometd 中的每个请求至少包含 Spring-security 识别所需的 JSESSIONID?
或者 Spring-security 中是否有一些设置可以实现这一点。
当我查找时,有很多用户面临这个问题,但没有明确的答案或有用的代码。
测试代码:
@Listener(value = "/service/testlistener/{id}")
public void testlistener(ServerSession remote,
ServerMessage message, @Param("id") String id) {
try {
Person user = this.personService.getCurrentlyAuthenticatedUser();
Map<String, Object> data = message.getDataAsMap();
System.out.println("currentlyAuthenticatedUser: " + user + " \nTransmitted Data in map:" + data.get("name"));
Map<String, Object> output = new HashMap<>();
output.put("name", user.getFirstName());
ServerChannel serverChannel = bayeux.createChannelIfAbsent("/person/" + id).getReference();
serverChannel.setPersistent(false);
serverChannel.publish(serverSession, output);
} catch (Exception e) {
e.printStackTrace();
}
}
cometd.js:
var connectionIntervall = null;
var onlineElement = document.getElementById("browser-online");
var cometd = $.cometd;
cometd.configure({
url: navigationController.generateCometDUrl(),
logLevel: 'error',
stickyReconnect: false,
appendMessageTypeToURL: false,
requestHeaders : navigationController.generateCometDHeaders()
});
var connects = 0;
cometd.addListener('/meta/handshake', _metaHandshake);
cometd.addListener('/meta/connect', _metaConnect);
cometd.websocketEnabled = true;
cometd.handshake();
【问题讨论】:
标签: java spring spring-security comet cometd