2016-09-13 16 views
0

JHipster 3.5.0をspring-bootとangleで使用してアプリケーションを構築しています。 サーバーから送信されたイベントを使用して、バックエンドからUIに更新を送信したいのですが、動作させることができません。ここでJHipsterでサーバーが送信するイベントとイベントソースを取得できません

は私RestControllerのコードです:

@RestController 
@RequestMapping("/api") 
public class SSEResource { 
    private final List<SseEmitter> sseEmitters = new CopyOnWriteArrayList<>(); 

    @RequestMapping(value = "/sse", method = RequestMethod.GET) 
    @Timed 
    public SseEmitter getSSE() throws IOException { 
     SseEmitter sseEmitter = new SseEmitter(); 
     this.sseEmitters.add(sseEmitter); 
     sseEmitter.send("Connected"); 
     return sseEmitter; 
    } 

    @Scheduled(fixedDelay = 3000L) 
    public void update() { 
     this.sseEmitters.forEach(emitter -> { 
      try { 
       emitter.send(String.valueOf(System.currentTimeMillis())); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }); 
    } 
} 

は私のAngaluarコントローラは、次のようになります。私はそのコードを使用しようとすると

(function() { 
    'use strict'; 

    angular 
     .module('myApp') 
     .controller('SSEController', SSEController); 

    SSEController.$inject = []; 

    function SSEController() { 
     var vm = this;    

     vm.msg = {}; 

     function handleCallback(msg) { 
      vm.msg = msg.data; 
     } 

     vm.source = new EventSource('api/sse'); 
     vm.source.addEventListener('message', handleCallback, false); 
    } 
}) 
(); 

私は

406を受け取ります許容できないHTTPステータス

リクエストヘッダーのため承認: "text/event-stream"。私は手動でにそのヘッダーを変更した場合は受け入れる:「/*」とリプレイ私のブラウザのデバッグツールを使用して要求することを私が手に

401不正なHTTPステータス

私が欠けていると思いますかなりシンプルなものですが、私はSecurityConfigurationとauthInterceptorをチェックしています。

誰かが私が間違っていることを説明できますか?私はHTTP-ヘッダー「認可」に依存しているJWT認証、とJhipsterを使用してい

:ソリューションは本当に簡単ウント本当にunsatisfingです:自分の質問にanwserする

答えて

1

EventSourceはヘッダーをサポートしていません!See

溶液は、ヘッダーをサポートするポリフィルを使用することができます。私は正常にヘッダのサポートは、もはやマスターブランチにも、元のポリフィルに含まれているいくつかの理由でこの Commit of eventsource polyfill with support for headers

(function() { 
    'use strict'; 

    angular 
     .module('myApp') 
     .controller('SSEController', SSEController); 

    SSEController.$inject = ['$scope', 'AuthServerProvider']; 

    function SSEController($scope, AuthServerProvider) { 
     var vm = this;    

     vm.msg = {}; 

     var options = { 
      headers : { 
       Authorization : "Bearer " + AuthServerProvider.getToken() 
      } 
     } 

     vm.source = new EventSource('api/sse', options); 
     vm.source.addEventListener('message', handleCallback, false); 
    } 
}) 
(); 

でそれをテストしました。 私は完全に行くthats正しい方法ではない。私はおそらくウェブソケットに切り替えるでしょう。

EDIT: 標準のEventSourceを使用する方法が見つかったと思います。 JWTFilterクラスには、リクエストパラメータからアクセストークンを取得する方法が含まれています。だから、僕は、このようのEventSourceを使用することができます:私は親切、私はその前に見ていなかったことを恥ずかしいこと

source = new EventSource('api/sse?access_token=' + AuthServerProvider.getToken()); 

とても簡単。

関連する問題