POST変数をリンクで渡す

 複数のWebサーバ間をログイン情報などを引き継いで記憶させる場合に、 リンクをクリックした時に、 リンク先のCGIやPHPのスクリプトにPOST変数を渡したいと思うことがあります。 POSTメソッドにしたい理由は、GETメソッドの場合は

http://another.web.server.co.jp/path/of/abc.php?user_id=uranom
のようにURLについてしまうので、URLにそのように書けば、 誰でも改ざんができてしまうので、POST渡しにしたいのです。 もちろん、SUBMITボタンを使えば簡単ですが、ここではデザインその他の理由で、 ボタンではなくリンクで飛びたいものとします。 これはJavaScriptと連係して、次のように可能です。

まず、入力フォームを含むHTML文書です。

<html>
<body bgcolor="white">
<script language="javascript">
<!--
function aaa(formName){ document.forms[formName].submit(); }
// -->
</script>

<p>
<form action="/test/postwizlink2.php" name="FORM1" method="POST">
<input type="hidden" name="user_id" value="urano354">
</form>

<form action="/test/postwizlink3.php" name="FORM2" method="POST">
<input type="hidden" name="user_id" value="urano468">
</form>
</p>

<p>
<a href="javascript:aaa('FORM1')">フォーム1</a>
</p>
<p>
<a href="javascript:aaa('FORM2')">フォーム2</a>
</p>
</body>
</html>

次に、そのフォームから飛ぶリンク先のPHPスクリプトです。 $_SERVER["HTTP_REFERER"]をチェックするわけは、 上のフォームのHIDDEN要素と同じ内容をもつ HTML文書を、悪意のある別サーバにアップロードされてしまうと、 やはり改ざんができてしまうからです。

<html><body bgcolor="white">
<?php
if(! strstr($_SERVER["HTTP_REFERER"], "/test/postwizlink.html")){
  print "おおっと! 123<br>";
}
elseif(empty($_POST["user_id"])){
  print "おおっと! 234<br>";
}
else{
  $user_id = $_POST["user_id"];
  print "こんにちは、${user_id}さん!<br>";
}
?>
</body></html>

新ウィンドウをポップアップして渡す
今度はさらに応用編です。これは、フォームを持つウィンドウAのリンクをクリックすると、 AのFORMのジャンプ先(ACTION=)になっているURLを新しく開いたウィンドウB に表示し、そのスクリプトにAのFORMで指定したフォーム変数を渡す、 という方法です。

<script language="javascript">
<!--
var win;
var formName;
function aaa(_formName){
  formName = _formName;
  date = new Date();
  s = date.getHours() + date.getMinutes() + date.getSeconds();
  win = window.open(window.location.href, "w" + s);
  setTimeout('aaa2()', 500);
}
function aaa2(){
  win.document.forms[formName].submit();
}
// -->
</script>

JavaScript部分だけの抜粋です。 関数を2つ定義して、SetTimeoutを使っているのが変ですが、 これは2回以上繰り返すと、MSIEでは、2回目以降は win.document.forms[formName].submit() が 「win.document.forms[formName]...はNullまたはオブジェクトではありません」 というエラーになってしまう(最初の1回目だけうまくいく) ためです。あれこれ試して、このように少しタイムアウトしてイベント処理時間をはさむと、 うまくいくみたいです。詳しいめかにずむは、あんまりわかっていません。

Open Source Web Architecture Top

(first uploaded 2002/06/28 last updated (not ever), URANO398)

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル