複数の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回目だけうまくいく)
ためです。あれこれ試して、このように少しタイムアウトしてイベント処理時間をはさむと、
うまくいくみたいです。詳しいめかにずむは、あんまりわかっていません。
(first uploaded 2002/06/28 last updated (not ever), URANO398)
|