1

我正在尝试为跨域 AJAX POST 查询创建代理,为此,我需要将客户端(浏览器)请求中的 cookie 添加到我发送到 PHP 后端的 POST 请求中,这是使用 HttpWebRequest。为此,我将每个 Request.Cookie 添加到 HttpWebRequest.CookieContainer 对象中。出于某种原因,我添加到其中的任何 cookie 都没有到达我的 PHP 后端。

我从一些搜索中了解到 CookieContainer 对象是依赖于 URI 的(我什至不知道如何解释它!),所以也许这就是我的问题的原因。但是,我尝试将我的 cookie 上的域设置为不同的东西,它似乎并没有影响它。因此,URI 的含义可能与 Cookie 的域参数不同。如果是这样的话,我就卡住了。

如果存在替代解决方案,我完全赞成(如果有一种方法可以在不需要插件的情况下在 asp.net 中进行自动跨域代理,那将挽救我的生命!)。

这是我正在使用的代码。

<%@ Page Language="VB" validateRequest="false" Debug="true" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Net" %>
<script runat="server">

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            Dim displayValues As New StringBuilder()
            Dim CookieJar as New CookieContainer
            Dim objCookieColl as HttpCookieCollection
            Dim objThisCookie As HttpCookie
            Dim myCookie As HttpCookie
            Dim arr1() As String
            Dim myCount as Integer

            objCookieColl = Request.Cookies
            arr1 = objCookieColl.AllKeys
            Dim postedValues As NameValueCollection = Request.Form
            Dim nextKey As String
            For i As Integer = 0 To postedValues.AllKeys.Length - 1
                nextKey = postedValues.AllKeys(i)
                If nextKey.Substring(0, 2) <> "__" Then
                    displayValues.Append("&" & nextKey)
                    displayValues.Append("=")
                    displayValues.Append(Server.UrlEncode(postedValues(i)))
                End If
            Next

            Dim uri As New Uri("http://www.otherdomain.com/subfolder/backend.php")
            Dim data As String = displayValues.ToString
            If (uri.Scheme = uri.UriSchemeHttp) Then
                Dim postRequest As HttpWebRequest = HttpWebRequest.Create(uri)
            For index As Integer = 1 to UBound(arr1)
                objThisCookie = objCookieColl(arr1(index))
                Dim tempCookie As New Cookie(objThisCookie.Name, objThisCookie.Value, objThisCookie.Path, Request.ServerVariables("HTTP_HOST"))
                myCount = myCount + 1
                CookieJar.Add(tempCookie)
            Next
                postRequest.CookieContainer = CookieJar
                postRequest.Method = Request.HttpMethod
                postRequest.ContentLength = data.Length
                postRequest.ContentType = "application/x-www-form-urlencoded"
                Dim writer As New StreamWriter(postRequest.GetRequestStream())
                writer.Write(data)
                writer.Close()

                Dim myResponse As HttpWebResponse = postRequest.GetResponse()
                Dim x As Integer
                While x < myResponse.Headers.Count
                    Response.AppendHeader(myResponse.Headers.Keys(x), myResponse.Headers(x))
                    x = x + 1
                End While
                Dim reader As New StreamReader(myResponse.GetResponseStream())
                Dim responseString As String = reader.ReadToEnd()
                myResponse.Close()
                Response.Write(responseString)

            End If
        End If
    End Sub

</script>
4

2 回答 2

0

我不熟悉 ASP 如何设置、存储和处理 cookie。但是在你的 PHP 后端尝试

<?php
echo "<pre>";
print_r($_COOKIE);
echo "</pre>";
?>

通过这种方式,您可以查看 PHP 是否甚至可以找到任何远程看起来像您尝试读取的 cookie 的 cookie。不过我不得不说,我不建议像这样混合语言,尽管我确信这种需求背后有合理的逻辑。我可以建议一个可能的替代方案。用一些 JavaScript 来弥补差距。设置您的变量,就像您希望它们存储在 cookie 中一样,然后使用 JavaScript 设置 cookie。 http://www.w3schools.com/JS/js_cookies.asp参考如何通过 JavaScript 设置 cookie 我知道用 PHP 我可以检索我用 JavaScript 设置的 cookie 所以希望这有助于一些,我知道的 ASP 你应该也可以在那里使用 JavaScript。

授予它,这不是全部解决方案的结束,也可能不是最好的。我不会在很多你可能试图连接正面和背面的东西上使用这个概念,但我看不出彼此之间有太大的伤害。

于 2011-05-25T09:15:09.347 回答
0

您的意思是您有一个使用.Net 运行的站点(在您的情况下为asp),然后您想将cookie 传递给另一个运行PHP 的应用程序?我认为 cookie 被阻止与另一个“站点”共享,因为不应该这样做。它通常被用作黑客的攻击媒介,因此我认为您的服务器正试图阻止它。

于 2011-05-25T09:17:55.507 回答