「キャンバスがクロスオリジンデータによって汚染されているため、キャンバスから画像データを取得できません」
Unable Get Image Data From Canvas Because Canvas Has Been Tainted Cross Origin Data
まず、問題の説明:
html5をサポートするブラウザでjavascriptスクリプトを実行します。スクリプトは、主にWebページのラベルキャンバスを操作するためのものです。エラー操作は、getImageData(img、……)、
chromeのエラーメッセージは次のとおりです。キャンバスがクロスオリジンデータによって汚染されているため、キャンバスから画像データを取得できません'、
fireFoxのエラーメッセージは次のとおりです。セキュリティエラー 'コード:' 1000'
キーコードは次のとおりです。
init:function(){ var img=new Image() img.src='http://10.0.5.199:8080/hadoopWebGis2/jsp/map.jsp?img=0_0_0' var ctx=this.context3D img.onload=function(){ ctx.drawImage(img,0,0) var imgData=ctx.getImageData(0,0,img.width,img.height) //Error line ctx.putImageData(imgData,50,50) } },
第二に、調査と回答
インターネットを検索したところ、ほとんどの人がこう言っていることがわかりました。getImageData関数はサーバー側で実行する必要があります。サーバー環境がない場合(たとえば、ローカルhtmlページのみ、ローカルイメージを操作する場合)、レポートが表示されます。'キャンバスがクロスオリジンデータによって汚染されているため、キャンバスから画像データを取得できません'エラー。
しかし、明らかに、上記のサンプルプログラムはTomcatサーバーで実行されており、それでもこのエラーが報告されています。それで、問題は何ですか?
後で私はstackoverflowで問題の原因を見つけました。((stackoverflowWebサイトを強くお勧めします。これは、C、C ++、Java、Web、Linuxなどの幅広いトピックをカバーする非常によく知られている技術的なQ&AWebサイトです。ほとんどの中国人学生は英語のウェブページを読むのが好きではありませんが、実際、中国のウェブページには多くの問題があります。 stackoverflowなど、多くの優れた英語のWebサイトで回答を見つける方法はたくさんあります。 )。
stackoverflowに関するこの質問への回答は次のとおりです。
次のように翻訳:なりすましを防ぐために、ブラウザは画像データを追跡します。あなたが1つを置くとき「」キャンバスドメインとは異なります「」画像がキャンバスに配置されると、キャンバスは「汚染」(汚染、汚れ)になり、ブラウザではキャンバスのピクセルを操作できなくなります。これは、複数のタイプのXSS / CSRF攻撃(2つの典型的なクロスサイト攻撃)をブロックするのに非常に役立ちます。
上記の言葉の要点は、赤でマークされたテキストが「キャンバスのドメインとは異なる」ということです。そこで、画像リクエストとページリクエストのアドレスを確認したところ、フィールドが実際に異なっていることがわかりました。
Image request address: http://10.0.5.199:8080/hadoopWebGis2/jsp/map.jsp?img=0_0_0 Enter the page in the browser to stop at: http://summer1:8080/hadoopWebGis2/jsp/map3D.html
(hostsファイルのマッピングは10.0.5.199:summer1ですが、ブラウザーが2つを自動的に変換すると言っても過言ではありませんが、理由はわかりませんが、別のドメインとして認識されます。)
変更後、問題は解決しました:
Image request address: http://summer1:8080/hadoopWebGis2/jsp/map.jsp?img=0_0_0 Enter the page in the browser to stop at: http://summer1:8080/hadoopWebGis2/jsp/map3D.html -----------------or------------------------- Image request address: http://10.0.5.199:8080/hadoopWebGis2/jsp/map.jsp?img=0_0_0 Enter the page in the browser to stop at: http://10.0.5.199:8080/hadoopWebGis2/jsp/map3D.html
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---
オフトピック:サーバー環境がないのはなぜですか(たとえば、ローカルhtmlページだけで、ローカルイメージを操作している)、レポートされます'キャンバスがクロスオリジンデータによって汚染されているため、キャンバスから画像データを取得できません'エラー?
個人的な理解:ローカルWebページのドメインはファイル://、といった: file:///home/summer/Desktop/test.html ローカル画像は間違いなくfile://で始まっていません。たとえば、Linux環境の画像は/home/summer/Desktop/test.pngであり、Windows環境の画像はc: tmp test.pngです。
原文: http://www.cnblogs.com/jdksummer/articles/2565998.html
転載:https://www.cnblogs.com/9546-blog/p/3392897.html