2016-08-11 1 views
1

私はangular2アプリを持っていて、データを取得するためにSpringでTomcatを使用しています。ページのリロードやリダイレクトは必要ありません。必要なのはデータだけなので、サーバーからのすべての応答に@ResponseBodyアノテーションが付いています。Spring @ResponseBodyはセッションを使用できません

私の問題は、この注釈のために私はユーザーのセッション変数を取得できないということです。ログインするとセッションが作成され、ユーザーデータはそこに保存されますが、次回の呼び出しでは取得できません。

@JsonIgnoreProperties(ignoreUnknown = true) 
@RequestMapping(method = RequestMethod.POST) 
@ResponseBody 
public String login(HttpServletRequest REQ, @RequestBody String BODY) throws Exception 
{ 
      ...check if all ok... 
       REQ.getSession().setAttribute("user", user); 
      ... return user data... 
} 

私はセッションを使用できるように、一緒に必要なデータを、クライアントに戻す自分のデータを送信することができ、他の方法があります。

編集: 問題はサーバ側ではなくクライアント側にあります。 Angularはデフォルトでクロスドメイン要求でCookie JSESSIONIDを送信しません。

+0

「ユーザーのセッション変数を取得できません」とはどういう意味ですか?それはコンパイルされませんか?それはクラッシュしますか?無効なデータまたは空のデータが返されますか?何かエラーメッセージが表示されますか? – Codo

+0

これはangular2とは関係がないので、そのタグを削除したいかもしれません。 –

+0

@Koos Gadellaa私はちょうど書き込みたいと思った - これは春とおそらくJavaとは関係ありません:)私は推測のポイントに依存します。 –

答えて

1

まず、リクエスト(Chrome開発ツールなど)のリクエスト/レスポンスを確認します。 TomcatはクライアントとサーバーセッションオブジェクトをバインドするためにJSESSIONIDという名前の新しいCookieを作成しますので、ログインメソッドのレスポンスヘッダーでこれを探します。次に、次回のリクエストでこのクッキーをサーバーに送り返していることを確認してください。セッションの作成はSpringまたは@ResponseBodyとは関係なく、その有効期間はコンテナ(Tomcat)によって管理されます。

また、ドメイン間の要求を行う場合は、this answerにチェックを入れてください。

+0

お返事ありがとうございます。私はうんざりして、間違った場所で探しました。問題はドメイン間リクエスト(CORS)と角度2です。このリンクにより、私はさらにthis.http.get( 'http:// ...'、{withCredentials:true})を一歩進めました。今度は次のリクエストでもヘッダーにcookieがあります。私はまだ問題があります。なぜなら、cookieはset-cookieとしてサーバーから送信されるものとは異なるからです。呼び出しがCORSでない場合は、このようなことは起こりません。 – FGHJ

1

セッションのコンテキストに置いたものは、クライアントでは使用できません。サーバーでのみ使用できます。サーブレットがどのように動作するか、特にセッション状態の仕組みに関する詳細については、this stack overflow postを参照してください。

ご覧のとおり、セッションIDを含むレスポンスにセッションクッキーを追加することで動作します。サーバーはそのIDの下にあるセッション状態をメモリーに格納し、将来の要求にそのsession-idが来ると、将来の要求に対してセッション状態を再び使用可能にします。

次のリクエストでセッション状態にアクセスできない場合は、セッションCookieが適切に伝播されていない可能性があります。最初に確認することをお勧めします。ログインする際のレスポンスに含まれている必要があります。また、サーバーへの追加要求に投稿する必要があります。

関連する問題