ウェブ開発メモ。
長いことやっていてもいろいろヤラれることがございます。
大体出来上がっているウェブシステムにて、
テストのフェーズだしもうコーディングしたくないしソースいじりたくないしなによりもう、
面倒くさい!
…場合はだいたいクライアント側(JSとか)で誤魔化そう対応しようと考えがちです。
クロスドメイン制約。
これでハマりました。あとプロキシでもはまったのですがそれはまた違う話ですので。
しょっぱなから仕様に組み込まれているなら原因とかの特定もスムーズなのかもしれませんがねえ…
相互通信サーバでございます
システムの概要はこうです。
・Aサーバ …データの蓄積を行う。データ取得と結果返却用のREST風API。クライアントも兼ねてるPC
・Bサーバ …データセンターのサーバ。Aからデータを取得して結果を返す。ウェブサイト側。
とまあわかりにくいですが、2つのサーバ間で通信しあうわけですよ。
Aのほうはわかりやすくレスポンスを返すだけのAPIの入り口二つ作って、それにいろんな方面からアクセスさせる方式で行っていました。
よくよく仕様を詰めていくと、「Bからもデータ渡さないとダメじゃね?」ってなって、
なんだよ・・・もう、ってことでちまちまローカル環境で無理やりやっていました。
疑似的にウェブフォームのデータをjQueryで非同期で送ってレスポンスはこっち側で書きこもう、そうしよう、面倒くさいし。。。
↑これがクロスドメイン制約にどっぷりはまる要因でした。
要は、クライアント(localhost)にあるサーバに通信したいので、
“http://192.168.0.111″→→→”http://localhost:83″にURLを変更して送信したいわけです。
【クロスドメイン制約】
- クロスドメイン問題
(中略)
ただし、このときひとつ問題が生じる。通常、ブラウザーソフトはセキュリティの都合で複数のドメインからデータを引き出すことができない。この場合のドメインは、サーバーの住所にあたるもので、ドメインが異なると別のサーバーということになる。
この複数のドメインからデータを引き出せない現象を、クロスドメイン制約あるいはクロスドメイン問題という。つまり「複数のドメインに同時にアクセスできないという制約、あるいはそういった問題」といった意味。
…(略)
引用元様にあるように、Javascriptのドメイン間通信の制限のことである。
これがなまじっかクライアントでやろうとしたのでなかなか原因がつかめず、
JSONPで試す。だめ。
ヘッダーをいじくってみる。だめ。
と繰り返して、途方にくれました。
最初からきちんとやればよいのですよ
めんどくさい、とか誤魔化すとか考えてはだめです。そういうことです。
結局本事案ではキチンと同期処理でソースを書いて、通信して、レスポンスも受けて、ログも出して、とやり直して解決。
ドメイン間の通信制限も、あーこんなんあったなあという感じなので、本当にJSデバッグするまで気づかず、「なんやねん、なんやねん??」状態でした。
それも当初はc#asyncで実装しててそれもはまったのでさらに事態をややこしくする羽目に。
そういう意味の「非同期」とちゃう、ちゅう話ですわ!
通信する処理はきっちりサーバ側で書いたほうがいい、という結論でした。。。