首页 > 解决方案 > 如何拦截 SockJS 发送的握手请求

问题描述

我正在尝试在 Angular 客户端和 Spring Boot 服务器之间创建套接字连接。

const ws = new SockJS(this.addressStorage.apiAddress + '/socket', null, {
  sessionId: function (): string {
    return that.authManager.playerId + ':' + lobbyName + ':' + uuid();
  }
});

创建 SockJS 实例后,客户端向我的服务器发送请求。 控制台屏幕,显示握手请求

由于我在服务器上启用了 WebSecurity,我需要授权每个请求,包括 sockjs 握手。所以在创建 SockJS 时,会弹出这个窗口:

显示 google 的 chrome 登录提示的屏幕

当客户端与服务器创建套接字连接时,我不希望用户再次写入他的登录名和密码。不幸的是,使用 SockJS 添加授权标头是不可能的,所以我决定使用拦截器。

这个拦截器不捕获 SockJS 握手:

export class SocketInterceptorService implements HttpInterceptor {

  constructor(private authManager: AuthManagerService) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    console.log(req.url);
    console.log(req);
    // req = req.clone({
    //   setHeaders: {
    //     Authorization: this.authManager.basicToken
    //   }
    // });
    return next.handle(req);
  }
} 

那么如何拦截 SockJS 握手以自动授权 SockJS 连接?

标签: angularspringinterceptorstompsockjs

解决方案


推荐阅读