2013-02-07 6 views
6

Android(2.3.x)の古いバージョンのweb/phonegapアプリケーションを構築しています。私がミックスにサーバーのリダイレクトを追加しようとするまで、すべてがうまく動作します。シナリオは次のとおりです。AngularJSを使用してサーバーからリダイレクトすると、Androidの無限リダイレクトループ

サーバー(node.js)には「/」をリスニングするルートがあります。このルートにヒットすると、セッションがあるかどうかを確認します。セッションがない場合は、/ loginにリダイレクトされます。この部分はうまく動作します(サーバーは賢明ですが、とにかく)。

問題は、クライアントがリダイレクトを取得したときに発生します。 Android 2.3はhistory.pushStateをサポートしていないので、hashbangsに戻ります。これはAngularJSがurlを/#!/ loginに書き換えてサーバーにセッションをチェックさせ、/ loginにリダイレクトするようにするサーバーリクエストを '/'に書き換え、AngularJSがURLを/#!/ログイン..など...無限に。

AngularJSでサーバからどのようにリダイレクトすることができますか?私のルートでこのロジックを処理する必要はありませんが、代わりにクライアントに実装しようとしますか?これを処理する方法がなければならないと確信していますが、わかりません。

ご協力いただければ幸いです。ありがとう!!

+0

をチェック{action: "redirect" url:"/login"}

を返し、
を私はあなたの説明に完全に従います:サーバーがリダイレクトを発行している場合は、AngularJSではなく、ブラウザで受信する必要があります。しかしおそらくxhr経由でサーバーからそのURLを取得していて、$ locationに割り当てることはできません。角度ドキュメントから: "$ロケーションサービスではURLだけを変更できますが、ページをリロードしてください。URLを変更してページをリロードするか、別のページに移動する必要がある場合は、より低いレベルのAPI、$ window.location.hrefを使用してください。あるいは、 '/ login#!/ login'にリダイレクトする必要がありますか? – Piran

+0

私は何が起こっているのかを正確に示したいと思いますが、Angularはサーバーのリダイレクトを「ハイジャック」しています。サーバーは/ loginとangleにリダイレクトして、これを/#!/ loginと書き換えます。これにより、サーバーは「ログインしていないのでログインにリダイレクトします」というメッセージを表示します。サーバーは/と経路を取得します(これはAngularがそれを書き換えるためです)。 –

答えて

0

純粋にクライアント側で認証した方が良いでしょう。私たちがログインしているかどうかを尋ねる最初の角度でajaxコールを行います。そうでない場合は、ユーザに情報を入力して(おそらくモーダルダイアログで)、POSTを実行してサーバ上の/ loginにします。

セキュリティのために、認証に関連する情報はクライアント側に格納しないでください。代わりに、ajaxで取得してください。ユーザーが正しくログインしていない場合は、401または何らかのエラーでAjaxに返信してください。

+0

これは私たちのアプリケーションの性質を与えるハード実装です - 私はすでにこれを試みました。私は悲しいことに、すでにセットアップされているサーバーアーキテクチャの枠内で作業しなければなりません。ありがとう、しかし! –

1

指揮リダイレクトするための単純なオブジェクトを使用します。ユーザーがログインしていない場合、私はわからないんだけど、その後クライアントで、応答を取得した後、action == 'redirect'$location.path(url)

関連する問題