1. ホーム
  2. asp.net

[解決済み] [Solved] Response.Redirect with POST instead of Get?

2022-05-04 12:27:16

質問

フォームから送信されたデータを保存し、ユーザーをサイト外のページにリダイレクトする必要があるのですが、リダイレクトの際に、GETではなくPOSTでフォームを送信する必要があります。

これを簡単に実現する方法があればいいなと思ったのですが、ないような気がしてきました。 私は今、私が望むフォームを持つ単純な別のページを作成し、そこにリダイレクトし、フォーム変数を入力し、そして単にdocument.forms[0].submit()を呼ぶスクリプトにbody.onloadコールをしなければならないと思う。

どなたか代替案があれば教えていただけませんか? プロジェクトの後半でこれを調整する必要があるかもしれないし、ちょっと複雑になるかもしれないので、他のページに依存しない簡単な方法があれば、それは素晴らしいことだと思います。

とにかく、すべての回答をありがとうございました。

解決方法は?

これを行うには、HTTPリダイレクトの仕組みを理解する必要があります。 あなたが Response.Redirect() で、(リクエストを行ったブラウザに)レスポンスを送信します。 HTTPステータスコード 302 これは、ブラウザが次にどこへ行けばよいかを示すものです。 定義によれば、ブラウザは、このことを GET リクエストであっても、元のリクエストが POST .

また、別の方法として HTTPステータスコード307 これは、ブラウザが元のリクエストと同じ方法でリダイレクトリクエストを行うが、セキュリティ警告をユーザーに表示することを指定します。 これを行うには、次のように記述します。

public void PageLoad(object sender, EventArgs e)
{
    // Process the post on your side   

    Response.Status = "307 Temporary Redirect";
    Response.AddHeader("Location", "http://example.com/page/to/post.to");
}

残念ながら、これはいつもうまくいくわけではありません。 ブラウザによって実装が異なる 一般的なステータスコードではないためです。

<ブロッククオート

残念なことに、Opera や FireFox の開発者と異なり、IEの開発者はこの仕様を読んだことがなく、最新の最も安全な IE7 でさえ、警告や確認ダイアログなしにドメイン A からドメイン B へ POST リクエストをリダイレクトしてしまいます Safariもまた興味深い振る舞いをします。確認ダイアログを出さずにリダイレクトを実行する一方で、POSTデータを捨ててしまうのです。 307リダイレクトをより一般的な302リダイレクトに効果的に変更することができます。

ですから、私の知る限り、このようなものを実装する唯一の方法は、Javascriptを使用することでしょう。 私の頭の中では、2つの選択肢があります。

  1. フォームを作成し、その action 属性はサードパーティサーバーを指します。 次に、送信ボタンにクリックイベントを追加して、まずデータとともにあなたのサーバーにAJAXリクエストを実行し、それからサードパーティのサーバーにフォームが送信されるようにします。
  2. サーバーに投稿するためのフォームを作成します。 フォームが送信されたら、ユーザーに、渡したいデータをすべて隠し入力したフォームがあるページを見せます。 リダイレクト中です..."のようなメッセージを表示するだけです。 そして、そのページにjavascriptのイベントを追加して、サードパーティのサーバーにフォームを送信します。

この2つのうち、私なら2番目を選びます。理由は2つあります。 1つ目は、1つ目の方法よりもJavascriptが不要なので信頼性が高いことです。Javascriptを有効にしていない人には、隠しフォームの送信ボタンを常に見えるようにしておき、5秒以上かかったら押すように指示すればよいのです。 次に、どのデータをサードパーティサーバーに送信するかを決めることができます。フォームをそのまま処理するだけでは、投稿データをすべて渡すことになり、必ずしも望むものではありません。 307のソリューションも同様で、すべてのユーザーに対して有効であったと仮定します。

お役に立てれば幸いです。