当前位置:  开发笔记 > 编程语言 > 正文

Response.Redirect与POST而不是Get?

如何解决《Response.Redirect与POST而不是Get?》经验,为你挑选了5个好方法。

我们需要提交表单并保存一些数据,然后将用户重定向到异地页面,但在重定向时,我们需要使用POST"提交"表单,而不是GET.

我希望有一个简单的方法来实现这一目标,但我开始认为没有.我想我现在必须创建一个简单的其他页面,只需要我想要的表单,重定向到它,填充表单变量,然后对只调用document.forms [0] .submit的脚本执行body.onload调用( );

任何人都可以告诉我是否有其他选择?我们可能需要稍后在项目中调整它,它可能会变得有点复杂,所以如果有一个简单的我们可以做到这一切所有非其他页面依赖,这将是太棒了.

无论如何,感谢任何和所有的回应.



1> tghw..:

这样做需要了解HTTP重定向的工作方式.当您使用时Response.Redirect(),您使用HTTP状态代码302发送响应(发出请求的浏览器),该状态代码告诉浏览器接下来要去哪里.根据定义,浏览器将通过GET请求进行,即使原始请求是a 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也会将POST请求从域A重定向到域B,而不会发出任何警告或确认对话框!Safari也以有趣的方式运行,虽然它没有引发确认对话框并执行重定向,但它会丢弃POST数据,有效地将307重定向更改为更常见的302.

所以,据我所知,实现这样的事情的唯一方法是使用Javascript.我可以想到两个选项:

    创建表单并使其action属性指向第三方服务器.然后,将click事件添加到提交按钮,该按钮首先使用数据向服务器执行AJAX请求,然后允许将表单提交给第三方服务器.

    创建表单以发布到您的服务器.提交表单时,向用户显示一个页面,其中包含您要传递的所有数据的表单,所有这些都在隐藏的输入中.只需显示"重定向..."等消息即可.然后,将javascript事件添加到将表单提交给第三方服务器的页面.

在这两个中,我会选择第二个,原因有两个.首先,它比第一个更可靠,因为它不需要Javascript工作; 对于那些没有启用它的人,你总是可以看到隐藏表单的提交按钮,并指示他们按下它需要超过5秒.其次,您可以决定将哪些数据传输到第三方服务器; 如果你只使用处理表单,你将传递所有的帖子数据,这并不总是你想要的.同样适用于307解决方案,假设它适用于所有用户.

希望这可以帮助!


@JoeCool下面是Pavlo Neyman给出的答案

2> Pavlo Neiman..:

你可以使用这个方法:

Response.Clear();

StringBuilder sb = new StringBuilder();
sb.Append("");
sb.AppendFormat(@"");
sb.AppendFormat("
",postbackUrl); sb.AppendFormat("", id); // Other params go here sb.Append("
"); sb.Append(""); sb.Append(""); Response.Write(sb.ToString()); Response.End();

结果就在客户端从服务器获取所有html之后,事件onload发生触发表单提交并将所有数据发布到定义的postbackUrl.


+1(如果可以,我会加你更多​​).这就是答案.雄辩并且重点突出.你甚至包括了所有的代码来代替你的头脑.我在我的aspx页面上的iframe中使用了它,它完美呈现了一切 - 没有重写网址.优秀作品!对于那些使用iframe的人来说:我将我的iframe指向另一个执行此代码的aspx页面.
这样做的支持方法使用307是有原因的.POST操作旨在进行幂等事务.这个答案仅仅是一个工作的黑客,并且将来很容易被浏览器阻止.
@sam好点.作为一个反驳论点:根据最佳答案,IE开发人员甚至没有阅读过307.阅读它的其他人错误地实现了它.这意味着307显然让智能混淆(假设浏览器开发人员很聪明)并且容易出现解释错误.上面的方法很清楚,至少对我而言,它适用于过去和现在的所有浏览器.不要太担心未来,因为我们开发人员打过去(阅读IE7)和现在进/出.恕我直言,因为每个人都得到了正确的答案,他们应该保持原样.将来阻止它的理由是什么?
这与TGHW的第二种选择有何不同?您是否还可能要求别人不小心引入XSS漏洞?

3> FlySwat..:

HttpWebRequest用于此目的.

在回发时,为您的第三方创建一个HttpWebRequest并发布表单数据,然后一旦完成,您可以在任何地方使用Response.Redirect.

您可以获得额外的好处,即您不必命名所有服务器控件以使第三方形成,您可以在构建POST字符串时执行此转换.

string url = "3rd Party Url";

StringBuilder postData = new StringBuilder();

postData.Append("first_name=" + HttpUtility.UrlEncode(txtFirstName.Text) + "&");
postData.Append("last_name=" + HttpUtility.UrlEncode(txtLastName.Text));

//ETC for all Form Elements

// Now to Send Data.
StreamWriter writer = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";                        
request.ContentLength = postData.ToString().Length;
try
{
    writer = new StreamWriter(request.GetRequestStream());
    writer.Write(postData.ToString());
}
finally
{
    if (writer != null)
        writer.Close();
}

Response.Redirect("NewPage");

但是,如果您需要用户从此表单中查看响应页面,您唯一的选择是使用Server.Transfer,这可能会也可能不起作用.


用户可能拥有不会通过此方法传输的cookie数据,因为这是从服务器发生的.

4> ZooZ..:

这应该让生活更轻松.您可以轻松地在Web应用程序中使用Response.RedirectWithData(...)方法.

Imports System.Web
Imports System.Runtime.CompilerServices

Module WebExtensions

     _
    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("")
        sb.AppendFormat("")
        sb.AppendFormat("
", aDestination) For Each key As String In aData sb.AppendFormat("", key, aData(key)) Next sb.Append("
") sb.Append("") sb.Append("") aThis.Write(sb.ToString()) aThis.End() End Sub End Module



5> Mike K..:

ASP.Net 3.5中的新功能是ASP按钮的"PostBackUrl"属性.您可以将其设置为您要直接发布到的页面的地址,当单击该按钮时,而不是像平常一样回发到同一页面,而是发布到您指定的页面.便利.确保UseSubmitBehavior也设置为TRUE.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有