我们需要进行表单提交并保存一些数据,然后将用户重定向到站点外的页面,但是在重定向过程中,我们需要使用POST而不是GET“提交”表单。

我希望有一个简单的方法来完成这一点,但我开始觉得没有。我想我现在必须创建一个简单的另一个页面,只有我想要的表单,重定向到它,填充表单变量,然后做一个主体。Onload调用脚本,只调用document.forms[0].submit();

谁能告诉我还有别的选择吗?我们可能需要在项目后期进行调整,它可能会变得有点复杂,所以如果有一个简单的方法,我们可以做所有不依赖于其他页面的事情,那就太棒了。

无论如何,感谢所有的回复。


当前回答

认为这可能是有趣的分享,heroku这样做与它的SSO到附加组件提供程序

它如何工作的例子可以在“kensa”工具的源代码中看到:

https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb

并且可以在实践中看到,如果你转向javascript。示例页面来源:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Heroku Add-ons SSO</title>
  </head>

  <body>
    <form method="POST" action="https://XXXXXXXX/sso/login">

        <input type="hidden" name="email" value="XXXXXXXX" />

        <input type="hidden" name="app" value="XXXXXXXXXX" />

        <input type="hidden" name="id" value="XXXXXXXX" />

        <input type="hidden" name="timestamp" value="1382728968" />

        <input type="hidden" name="token" value="XXXXXXX" />

        <input type="hidden" name="nav-data" value="XXXXXXXXX" />

    </form>

    <script type="text/javascript">
      document.forms[0].submit();
    </script>
  </body>
</html>

其他回答

这应该会让生活轻松得多。 你可以简单地在你的web应用程序中使用Response.RedirectWithData(…)方法。

Imports System.Web
Imports System.Runtime.CompilerServices

Module WebExtensions

    <Extension()> _
    Public Sub RedirectWithData(ByRef aThis As HttpResponse, ByVal aDestination As String, _
                                ByVal aData As NameValueCollection)
        aThis.Clear()
        Dim sb As StringBuilder = New StringBuilder()

        sb.Append("<html>")
        sb.AppendFormat("<body onload='document.forms[""form""].submit()'>")
        sb.AppendFormat("<form name='form' action='{0}' method='post'>", aDestination)

        For Each key As String In aData
            sb.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", key, aData(key))
        Next

        sb.Append("</form>")
        sb.Append("</body>")
        sb.Append("</html>")

        aThis.Write(sb.ToString())

        aThis.End()
    End Sub

End Module

我会这么做:

将数据放入标准表单(不带runat="server"属性),并将表单的动作设置为发布到目标场外页面。 在提交之前,我将使用XmlHttpRequest将数据提交到服务器并分析响应。如果响应意味着你应该继续与场外张贴然后我(JavaScript)将继续与张贴,否则我会重定向到我的网站上的一个页面

@Matt,

您仍然可以使用HttpWebRequest,然后将您接收到的响应定向到实际的输出流响应,这将为用户提供响应。唯一的问题是任何相对url都会被破坏。

不过,这可能奏效。

ASP中的一些新东西。Net 3.5是ASP按钮的“PostBackUrl”属性。您可以将其设置为您想要直接发布到的页面的地址,当单击该按钮时,它不会像正常情况下那样发布回同一页面,而是会发布到您所指示的页面。方便。确保UseSubmitBehavior也被设置为TRUE。

GET(和HEAD)方法绝不能用来做任何有副作用的事情。副作用可能是更新web应用程序的状态,或者可能是收取您的信用卡费用。如果某个操作有副作用,则应该使用另一种方法(POST)。

因此,用户(或他们的浏览器)不应该对GET所做的事情负责。如果由于GET而产生了一些有害或昂贵的副作用,那将是web应用程序的错,而不是用户的错。根据规范,用户代理不能自动跟踪重定向,除非它是对GET或HEAD请求的响应。

当然,许多GET请求确实有一些副作用,即使它只是附加到日志文件中。重要的是,对这些影响负责的应该是应用程序,而不是用户。

HTTP规范的相关章节是9.1.1、9.1.2和10.3。