2017-11-16 19 views
0

ファイルの内容を返すサーバーへの$ http.post()呼び出しを行うng-click実装があります。したがって、ファイルのダウンロードはブラウザで行われます。ダウンロード後の新しいセッション - 角度js - 内部休憩コール

$scope.downloadFile = function(mediaObj) { 
     var downloadReq = { 
      "cid": $cId, 
      "pid":$pId, 
      "mid":$mId 
     }; 
     $http.post(<server url>, downloadReq) 
     .then(function(response) { 
       var downloadUrl = URL.createObjectURL(new Blob([response.data])); 
       var a   = document.createElement('a'); 
       a.href   = downloadUrl; 
       a.target  = '_blank'; 
       a.download  = response.headers('Content-Disposition').split(';')[1].trim().split('=')[1]; 
       document.body.appendChild(a); 
       a.click(); 
       a.remove(); 
      }, function(response) { 
       //unable to download 
       $scope.downloadErr = true; 
      }); 
    } 

サーバー側のコードスニペットは、このようなものです::この後

public void handleDownloadRequest(String json, HttpServletRequest request, HttpServletResponse httpServletResponse) { 
    .... 
    // make rest call to another microservice to get file content 
    IOUtils.copyLarge(new ByteArrayInputStream((byte[])response.getBody()), httpServletResponse.getOutputStream()); 
    // copy all headers from rest call response to httpServletResponse 

    httpServletResponse.flushBuffer(); 
} 

、サーバーへの次の呼び出しは、(それは、他のサーバのコールを自分自身をダウンロードする必要はありません)されて、以下のコードスニペットです新しいセッションを開始する古いセッションは破棄されました。

このため、サーバー側クライアントセッションの状態が失われ、クライアントでの作業がうまくいきません。

誰でも、ダウンロード操作後に新しいセッションが作成される理由を理解できますか?私はこれを避けることができますか?なぜ古いセッションが破壊されていますか?

ありがとうございます。

答えて

0

私は自分の質問に答えています。多分それは誰かの時間を節約するでしょう。 handleDownloadRequest()メソッドの一部として、私はファイルデータを取得するために別のマイクロサービスへの呼び出しを行っていました。そのrest呼び出しのhttpresponseには、handleDownloadRequest()メソッドのhttpServletResponseにもコピーされていた新しいセッションIDがありました。 これがクライアントに伝播していき、クライアントセッションの状態が失われました。

解決:ヘッダー上にコピーしながら私は、応答からセッションクッキーヘッダを除去します。

内部レスポンスコール中にhttp応答を処理します。