Asial Blog

Recruit! Asialで一緒に働きませんか?

AJAX内でのリダイレクト処理の罠

カテゴリ :
フロントエンド(HTML5)
タグ :
Tech
Ajax
symfony
こんばんは。笹亀です。

iPhoneの白をず〜〜っと待っているのですが、
今年末ということになってとても残念でなりません。
ここまで待ったので気長に待つことにします。

さて今日はAJAX内でのリダイレクト処理をした際に、
起こったことをご紹介させていただきます。

結論から言うと、
「AJAX内でリダイレクトするときはセッションは使うな!」

まずは遷移として下記のように試しました。
AJAXでSymfonyをfile_get_contentsで呼び出すスクリプトを指定します。
  1. info.php
  2.  ↓AJAXで呼び出し
  3. get.php(外部のSymfonyで作成されたページの呼び出し)
  4.  ↓file_get_contents関数で呼び出し
  5. http://sasa.local/top/sessionTest
  6.  ↓(Symfony内でリダイレクト
  7. http://sasa.local/top/sessionTest1
  8. ※Symfonyのリダイレクト(redirect)を使用してセッションのデータを書き込んで値を引き継ぐことができるのかを試しました。

まずは表示する側のページを作成します。

-- info.php
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta http-equiv="Content-Style-Type" content="text/css" />
  7. <meta http-equiv="Content-Script-Type" content="text/javascript" />
  8. <title>symfony&ajax session Test</title>
  9. <script language="JavaScript" type="text/javascript" src="/jquery.js"></script>
  10.  
  11.  
  12. <!-- EXPAND SKIPED -->
  13. <script type="text/javascript">
  14. <!--
  15. function ajax_test() {
  16.   $.ajax( {
  17.     type : "POST",
  18.     url : "get.php",
  19.     data : {param : "sasagame hiroshi"},
  20.     success : function(txt) {
  21.       $('#view_area').html(txt);
  22.     },
  23.     error : function() {
  24.       alert('error');
  25.     }
  26.   });
  27. }
  28. // -->
  29. </script>
  30. </head>
  31. <body>
  32. symfonyとセッションのテスト中<br />
  33. <input type="button" name="test" onClick="ajax_test();return false;" value="テスト開始">
  34.  
  35. <div id="view_area">
  36.  
  37. </div>
  38. </body>
  39. </html>

次にAJAXの呼び出し側のPHPスクリプトを作成します。
-- get.php
  1. <?php
  2.   $html = file_get_contents('http://sasa.local/top/sessionTest?param=sasagame+hiroshi');
  3.   echo $html;
  4. ?>
※ここではSymfonyで作成されたページを指定しております


get.phpで呼び出しているSymfony側の処理を実装します。

  1. ・・・省略
  2.   public function executeSessionTest(sfWebRequest $request)
  3.   {
  4.     $param = $request->getParameter('param');
  5.     $this->getUser()->setAttribute('session_test', $param);
  6.     $this->redirect('top/sessionTest1');
  7.   }
  8.  
  9.   public function executeSessionTest1(sfWebRequest $request)
  10.   {
  11.     $param = $request->getParameter('param');
  12.     $session_data = $this->getUser()->getAttribute('session_test', '取得できない');
  13.     echo 'session_test_data:' . $session_data . "<br />";
  14.     echo print_r($_SESSION, true);
  15.     exit;
  16.   }
  17. ・・・省略

上記のように実装完了後に実際に動かしてみます。


テスト開始ボタンをクリック・・

うあ、やっぱり取得できません。

普通にSymfony側を実行すれば、セッションデータの取得はおこなえます。


普通にAJAXで処理するときには、ご紹介させていただいたようなリダレクトして処理を遷移させて使うみたいなことはそうそうないことだとおもいます。
今回はイレギュラー的にどうしてもセッションを使ってリダイレクトすることになってしまいました。なぜだといろいろと試行したため時間を使いました。先入観で出来るだろうと思って使うと痛い目にあいますというか痛い目にあいました。

教訓としてはこんな遠まわしな使い方をするなということと先入観で使用するなでした^^;

皆さんもAJAX使うときには気をつけてくださいませ。