私が読んだことから、ドメイン間でCookieを送信することは不可能です(ブラウザがプライバシー上の理由でそれらをブロックしていることを理解しているため)。ただし、誰かが回避策について教えてくれることを願っています。
.Net winFormsクライアントでこれを達成しましたが、Webソフトウェアで動作させることができません。
シナリオ:私のWebサイトがあります。これは、顧客のファイアウォールの内側に存在し、オフィスの外部からアクセスできないXMLを使用したREST実装を使用するサードパーティシステムを呼び出す必要があります(VPNもオプションではありません)。
私は自分のクッキーを設定しました:
$.cookie('name', 'value', {path : '/', domain : '192.168.254.164'});
投稿リクエストを行う
$.post(call, function(d) {}, 'text')
.success(function(d) {... /*do something*/
ただし、Cookieは送信されません(以下の要求ヘッダーと応答ヘッダーを参照してください)
Request Headers Accept text/plain, */*; q=0.01 Accept-Encoding gzip, deflate Accept-Language en-gb,en;q=0.5 Connection keep-alive Host 192.168.254.164:8080 Origin http://localhost:27249 Referer http://localhost:27249/index.html User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 Response Headers Access-Control-Allow-Orig... http://localhost:27249 Cache-Control no-cache Content-Type application/xml;charset=UTF-8 Date Tue, 01 May 2012 15:14:58 GMT Server Sun Java System Application Server 9.1_01 Set-Cookie JSESSIONID=8f7fbcd40348c0b5d912830bca8a; Path=/App Transfer-Encoding chunked X-Powered-By Servlet/2.5
私が受け取った応答は、私が無許可であることを示しています(これはCookieが設定されていないためです)。
サードパーティのサーバーでは何も変更できないため、プロキシではすべてがXMLであるため、JSONPを使用できません。
デバッグのために、送信する前にCookieを読み取ろうとしましたが、結果は「null」になります。
alert($.cookie(_svcMnuCookieSessionIdKey));
私はWeb開発に慣れていないので、これは奇妙な質問かもしれませんが、応答ヘッダーからわかるように、ブラウザーがCookieを処理するため、Cookieを受信していると思います(ログインすると同じCookieを受信します)。 、それを保存して私のリクエストに自動的に適用するべきではありませんか?上記のように手動で追加するのではなく?とはいえ、JSESSIONIDは両方のリクエストで異なる値を持っているように見え、仕様では、Cookieの値としてログインしたときに取得した元のJSESSIONIDを使用する必要があると規定されています。
私の.Netアプリでは、次のようにしています。
Dim httpWebRequest As Net.HttpWebRequest = CType(Net.WebRequest.Create("http://192.168.254.164:8080/App/RestfulService"), Net.HttpWebRequest)
httpWebRequest.UserAgent = My.Application.Info.AssemblyName
httpWebRequest.KeepAlive = True 'set the connection keep-alive (this is the default)
httpWebRequest.Headers.Set(Net.HttpRequestHeader.Pragma, "no-cache") 'we don't want caching to take place so we need to set the pragma header to say we don't want caching
httpWebRequest.Method = "POST"
If Not String.IsNullOrEmpty(_sessionId) Then 'it isn't used on some request, so don't add it if it is nothing
Dim cookie As New System.Net.Cookie("JSESSIONID", _sessionId)
cookie.Domain = New Uri("http://192.168.254.164:8080/App/RestfulService").Host
httpWebRequest.CookieContainer = New Net.CookieContainer
httpWebRequest.CookieContainer.Add(cookie)
End If
httpWebRequest.ContentType = "application/x-www-form-urlencoded"
Dim postData As Byte() = New System.Text.UTF8Encoding(False).GetBytes(RichTextBox1.Text)
httpWebRequest.ContentLength = postData.Length
Using tmpStream As IO.Stream = httpWebRequest.GetRequestStream
tmpStream.Write(postData, 0, postData.Length)
End Using
Dim httpWebResponse As Net.HttpWebResponse = CType(httpWebRequest.GetResponse, Net.HttpWebResponse)
If WebValidation.WebResponseHasContent(httpWebResponse) Then
Dim str As String = String.Empty
'Read the raw HTML from the request
Using sr As New IO.StreamReader(httpWebResponse.GetResponseStream, System.Text.Encoding.UTF8)
str = sr.ReadToEnd
End Using
End If
Return str
それで、これはクロスドメインのクッキーリクエストですか?Webクライアントでこの機能を再作成するにはどうすればよいですか?