はじめに
とあるWEBページで、GETストリングで受け取った値をページロード時に
別のサイトへPOSTでリダイレクトする必要があったので、その方法をメモっておきます。
.NETの性質上POSTデータを送る場合以下のようなことになる。
ASP.NETの構想として、他のページ(特に他のAppドメイン)への遷移はGETを利用を想定。(セキュリティ面などから)
コンセプトとして、POSTはPOSTBACKのみの利用。例外として、LinkButtonコントロールを使うと、ノンコーディングでPOST送信で画面遷移ができる。
このとき、ページ上のコントロールのidが、そのままPOST変数名になる。
ただし、渡したくないコントロールの情報についてもPOSTされてしまう。(ボタン名やViewStateなど)そこをクリアすればこの方法でOK。LinkButtonが使えない場合は、JavaScriptで組むしか無い。
というわけで、ページロード時にリダイレクトしたいので、
.NET と JavaScript の組合せで対応しました。
え?JavaScript だけでやっちゃえば、いいじゃない?
その方法も試してみましたが、自分のテストが悪かったかもしれませんが、
URLエンコードされた文字列をJavaScriptで正しく解釈できなかったので、
このような形になりました。
まあ、.NET + JavaScriptの構成にしたおかげでページロード時に
.NET側で複雑な処理をさせることもできるようになりました。
(今回のサンプルではやっていませんが。)
サンプルコード
<%@ Page Language="vb" ResponseEncoding="UTF-8" %>
<%
txtval.Text = System.Web.HttpUtility.HtmlDecode(Page.Request.QueryString.Get("val"))
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function doPost() {
document.getElementById("val").value = document.getElementById("txtval").value
document.form1.method = "post";
document.form1.submit();
// return false;
}
</script>
</head>
<body>
<form name="form1" action="http://example.com/dest_post.aspx" method="post">
<input type="hidden" name="val" id="val" value="" />
</form>
<form runat="server" ID="GETSTRING">
<asp:TextBox ID="txtval" runat="server" Enabled="false" style="width:1px;" ></asp:TextBox>
</form>
</body>
</html>
<script type="text/javascript">
doPost();
</script>
仕様の簡単な説明
http://~~~/RedirectSample.aspx?txtval=hogehoge のようなリクエストがくると
txtvalの値をGETで受け取り、
http://example.com/dest_post.aspx へPOST送信でリダイレクトしています。
<form>タグを分割することによってリダイレクト先のPOST送信する変数名をカスタマイズしているところが
ポイントです。
最後に
セキュリティ上の理由で、このようなPOST送信はいけないような気がしますが、
こうすることにより、誰がどうなってどのように困るのか、私の貧困な想像力では分かりませんでした。
分かる方がいましたらお教えて頂けると嬉しいです。