- ベストアンサー
HP読み込み中に認証を行いたい
親ページのあるボタンを押すと、子ウィンドウが表示され、その子ウィンドウで認証を行ってから、親ウィンドウに次のページを表示させたいと思っています。 今試している方法はJavaScript(window.open)を使用し、開いた子ウィンドウでASPを使用して認証を行う方法です。 認証はうまくいくのですが、認証している間に親ページに次のページが表示されてしまいます。 色々試しているのですがうまくいきません。 このようなことをするのは不可能なのでしょうか? どなたかお分かりになる方がみえましたら教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと一ひねりすると出来そうです。 親を[A] と [C]。子供のウインドウを [B] とします。 [A] - window.open -> [B] - 承認 -> [C] としたいのですよね? ここで、別ページ [D] を用意します。 [A] - window.open -> [B] - 承認 -> [D] - 承認確認 -> [C] こんな流れにします。 [D] はページの内容を表示せずに、 [B] の承認が完了したことを待ちます。 例えば、クッキーを使って [D] に [B]の状態を知らせても良いでしょう。 他にも方法はあります。 [D] は、[B]からの信号が来るのをひたすら待ちます。 信号がやってきたら、 [C]を呼び出すか、[A] を呼び出すか判断を行い、 ページ遷移を行います。 ポイントは、[D] をはさんで [B] を待つ。 と言う部分です。 ただし、ブラウザが閉じられる可能性もあるので、 [B] は一定時間(一定回数ループするまで。。。かも知れない。)たったら、 [A] へ遷移する。と言うロジックが入っていた方が良いでしょう。
その他の回答 (4)
- Dpop
- ベストアンサー率51% (279/544)
#1 です。 [B]の構造を良く理解していないのですが、 [B]は[D]を呼び出しているのでしょうか? そうでないと、 > ID=Request.Form("id") ←Bからフォームで送られる > PW=Request.Form("passwd")←上に同じ は、意味が無い様な。。 [B]から[D]を呼び出すなら、環境変数の内容を引き渡せますが、そうで無いと消えてしまう様な気がします。 クッキーを使って渡すか、GETパラメータを作って[D]を呼び出すか。 が良い様な気がします。(安全性を考えると、パラメータかな。ただし、容易に想像ができない様にしないと、安全性の低下に繋がります。クッキー容認であればクッキー渡しの方が、簡単確実です。当然[D]はクッキーを削除する処理が必要ですが。) [B]が閉じられた情報を取得する事ってできないと思います。 [D]の方でタイムアウトを意識されるのが良いかと。 と、ここまで書いて考えたのですが。。。 [B]はID, PASSを入力したら、チェックを行わずに、[D]を呼び出す様にするのも良いですね。 ID, PASSチェックを[D]にやらせてしまえば、[D]側でのタイムアウト処理は不要ですね。 クッキー渡しにせずに、単にパラメータ渡しで行けますね。 [B]は[D]を呼び出すフォーム文と、自分自身をクローズする処理をいれれば良いかと。JavaScriptで遣らせればできそうですね。
お礼
早速のご回答ありがとうございます。 説明不足ですみません。 BはDを呼び出して?いません。BはDに値をフォームで渡したあとに閉じられます。DはAが表示されているウィンドウに表示されます。 つまり、2つのウィンドウがあって、表示される順は A→→→D(Bから送られてきた値を元に認証)→C B(Aから開かれ、値をDに送り、閉じる) という感じです。うまく図がかけないのですが・・・。
- moon_night
- ベストアンサー率32% (598/1831)
ベーシック認証が使えるのならばそれでやれば簡単ですが。 .htaccessを使う認証方式です。 Javascriptで行うのだったら、 親ウィンドウに空白のダミーページ (又は「読み込み中」など書かれたページ) から、子ウィンドウをだして、 子ウィンドウの認証が通ったら親ウィンドウを切り替えれば見た目はそうなりますね。
お礼
お礼を申し上げるのが遅くなり、申し訳ございませんでした。ベーシック認証についてよく理解していないので、調べてみようと思います。 ありがとうございました。
- nuki
- ベストアンサー率30% (6/20)
これまで他の方が紹介された方法とは別に、 2つの方法が考えられると思います。 1.IE専用の対応としてshowModalDialogを利用する InternetExplorerのJScriptにある、showModalDialogを 使って子ウィンドウを表示し、認証完了後に 親ウィンドウを次のページに遷移させる。 (社内システムなどのクライアント環境が特定できる 場合に有効) 子ウィンドウをモーダルダイアログにできる (親ウィンドウの操作を無効にできる)ので、 特別な実装を不要にできる。 2.子ウィンドウからの通知を待ってから次ページに 遷移する ANo.1の提案されたものに近いのですが、[D]を作成 しない方法です。 (1)親ウィンドウの全てのフォーム要素を無効にする (2)親ウィンドウから子ウィンドウを表示(window.open)する (3)子ウィンドウの認証結果を親ウィンドウに通知する (4)親ウィンドウの全てのフォーム要素を有効に戻して次のページに遷移する の手順になります。 ANo.1の方がご指摘の子ウィンドウを閉じられる問題 は、子ウィンドウ側のbodyタグのonunloadイベント ハンドラを利用すれば回避可能にできます。 (親ウィンドウの全てのフォーム要素を有効/無効に 切り替えられるのは、親ウィンドウがフレーム分割 されていないことが条件になります。)
お礼
お礼を申し上げるのが遅くなり、申し訳ございませんでした。window.openではうまく動作しなかったので、showModalDialogを使用してみようと思います。 ありがとうございました。
- Dpop
- ベストアンサー率51% (279/544)
#1 です。 少し間違えました。 最後の、 > [B] は一定時間(一定回数ループするまで。。。かも知れない。)たったら、 > [A] へ遷移する。と言うロジックが入っていた方が良いでしょう。 は、 [D] は一定時間(一定回数ループするまで。。。かも知れない。)たったら、 [A] へ遷移する。と言うロジックが入っていた方が良いでしょう。 です。申し訳ない!
お礼
お答えいただき、ありがとうございます。ひとつページを新たにはさむという発想はでてきませんでした。 早速この方法を試してみたのですが、うまくいきません。 Dが信号をまつという状態を下のようにループを使ったのですけど、この方法は間違っていますか?ASPが混ざっています。 <% For i=0 TO 100000 ID=Request.Form("id") ←Bからフォームで送られる PW=Request.Form("passwd")←上に同じ If ID="administrator" And PW="abc" Then %> <html> <body> 次のページを表示、フォームで情報を送る処理 </body> </html> <% Exit For End If Next %> ループをしている間に、Bから情報が送られてくるのをまつというようにしましたが、うまく情報を受け取れないようです。タイミングの問題でしょうか? この他にもBが閉じられたという情報をwindow.closed(JAVAScript)で得ようかとも思いましたが、ASPと混在させることはできませんよね? この他にも信号を待つ方法はあるのでしょうか? ご迷惑でなければ教えてください。