我試圖用簡單的代理,SockJS和STOMP來實現Spring Websocket。我的應用程序在擴展HandlerInterceptorAdapter類的自定義攔截器(稱爲SecurityInterceptor)中處理認證。 我想要建立連接時通過SOMP客戶端發出的HTTP請求,以通過我的攔截器類,以便驗證用戶是經過身份驗證的用戶。但是,這些初始HTTP請求不會通過我的自定義攔截器。請問有人能夠在這個問題上給我啓發嗎?以下是我在做什麼如何通過HandlerInterceptorAdapter連接到WebSocket
主要web配置班組長:
@Configuration
@EnableWebMvc
@ComponentScan({ "..." })
public class RestWebSvcMainConfig extends WebMvcConfigurerAdapter {
public void addInterceptors(final InterceptorRegistry oRegistry) {
try {
oRegistry.addInterceptor(securityInterceptor()).addPathPatterns("/dms/secured/**");
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
}
@Bean
public SecurityInterceptor securityInterceptor() throws Exception {
SecurityInterceptor oSecurityInterceptor = new SecurityInterceptor(authenticationProvider());
return oSecurityInterceptor;
}
}
的WebSocket配置類:
@Configuration
@ComponentScan({"..."})
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/dms/secured/hello").withSockJS();
}
}
控制器類:
@Controller
public class GreetingController {
@MessageMapping("/dms/secured/hello")
@SendToUser(value="/topic/greetings", broadcast = false)
public Greeting greeting(HelloMessage message) throws Exception {
Thread.sleep(3000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
}
}
分發程序Servlet的Web製圖.xml:
<!-- Map all requests to the dispatcher servlet -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
STOMP客戶端:
function connect() {
var socket = new SockJS('/GlobalAPI/dms/secured/hello');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/user/topic/greetings', function(greeting){
showGreeting(JSON.parse(greeting.body).content);
});
});
}
GlobalAPI是上下文根。
最初的請求是http://localhost:8080/GlobalAPI/dms/secured/hello/info沒有經過攔截器。當我做出任何其他HTTP請求,如http://localhost:8080/GlobalAPI/dms/secured/documents,請求很好地徹底攔截器。 我的代碼有什麼問題?
爲什麼要這樣。該請求不是由處理程序處理的,因此「HandlerInterceptor」不適用。爲了攔截Web套接字連接,你可能需要使用'HandshakeInterceptor'。 –