كيفية تنفيذ طلب عبر المجال في عنصر تحكم متصفح الويب؟
-
03-07-2019 - |
سؤال
كما تعلم، فإن إجراء طلبات Cross Domain XMLHTTP غير مسموح به لأسباب أمنية ضمن Internet Explorer.
لدي عنصر تحكم WebBrowser وأستخدمه DocumentText
بدلاً من Navigate
إلى عنوان URL.منذ المجال الحالي about:blank
عندما تحاول الصفحة تقديم طلب إلى نفسها أو إلى مجال آخر أحصل عليه Access is denied
خطأ في جافا سكريبت.
حتى عندما أستخدم Navigate
إذا قام Javascript بتقديم طلب إلى مجال آخر فلن يعمل.
كيف يمكنني الالتفاف حول هذا؟
يجب أن يعمل كود HTML هذا مع التحكم في WebBrowser:
<body>
<a href="javascript:getit('http://www.google.com')">this should work</a>
<div id="x"></div>
</body>
<script>
function XHConn()
{
var xmlhttp, bComplete = false;
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { try { xmlhttp = new XMLHttpRequest(); }
catch (e) { xmlhttp = false; }}}
if (!xmlhttp) return null;
this.connect = function(sURL, sMethod, sVars, fnDone)
{
if (!xmlhttp) return false;
bComplete = false;
sMethod = sMethod.toUpperCase();
try {
if (sMethod == "GET")
{
xmlhttp.open(sMethod, sURL+"?"+sVars, true);
sVars = "";
}
else
{
xmlhttp.open(sMethod, sURL, true);
xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
xmlhttp.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
}
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState == 4 && !bComplete)
{
bComplete = true;
fnDone(xmlhttp);
}};
xmlhttp.send(sVars);
}
catch(z) { return false; }
return true;
};
return this;
}
function getit(url){
var xmlhttp = new XHConn();
var fnWhenDone = function (oXML) { document.getElementById('x').innerHTML = oXML.responseText; alert(oXML.responseText); };
xmlhttp.connect(url, "GET", "", fnWhenDone);
}
</script>
- ليس لدي سيطرة على كود Javascript/HTML، تطبيقي يستضيف فقط عنصر التحكم في متصفح الويب
- لقد وجدت شيئا يسمى علامات إجراءات عنوان URL CROSS_DOMAIN_DATA, ، لست متأكدًا مما إذا كان هذا هو الاتجاه الصحيح.حتى أنني لست متأكدًا من كيفية تنفيذه.
- وأيضاً إذا كان بإمكانك الإجابة على هذا السؤال: كيفية تعيين document.domain الحالي في التحكم في WebBrowser لتجنب "تم رفض الوصول"؟ هذا يكفي بالنسبة لي أيضا.
المحلول
لقد وجدت حلاً بديلاً سيئًا، فقم بتحميل ملف HTML محلي (c: emp emp.html) ثم قم بتعديل محتواه عبر جافا سكريبت.
بعد هذه النقطة، لم تعد هناك قيود على CrossDomain ولكن استخدام document.write يسبب مشاكل سيئة أخرى مثل JQuery .ready
لن تعمل الوظائف.
نصائح أخرى
التحقق من هذا، عملت بالنسبة لي مثل السحر.http://support.microsoft.com/default.aspx?scid=kb;en-us;246227
لا أفهم في أي مجال لا يمكنك الوصول إلى Javascript...هل حاولت استخدام النصي علامة للحصول على البيانات التي تريدها من مجال مختلف؟يمكنك استخدام ال JSONP مصطلح لمساحة اسم البيانات ...
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.src = "anotherdomain.com/data?callback=myFunction";
head.appendChild(script);
ثم على "/ البيانات":
myFunction({
// data here
});
يبدو أن URLACTION-CROSS-DOMAIN-DATA هو الاتجاه الصحيح:اقرأ هذا لتعرف السبب
الطريقة الوحيدة للقيام بذلك هي التأكد من تشغيل التعليمات البرمجية الخاصة بك في المنطقة الموثوقة (أو أعلى مثل HTA).بشكل افتراضي، يتم تشغيل أي شيء يتم تشغيله داخل عنصر تحكم WebBrowser في المنطقة التي تأتي منها الملفات التي يتم تقديمها.(أي.يتم استخدام سياسات أمان IE القياسية.)
لتغيير هذا السلوك، ستحتاج إلى تغيير التطبيق الذي يستضيف عنصر تحكم WebBrowser وتنفيذ بعض الواجهات على عنصر تحكم WebBrowser هذا.(IInternetHostSecurityManager وIInternetZoneManager وIInternetSecurityMgrSite هي تلك التي يجب عليك إلقاء نظرة عليها.) هذه ليست مهمة تافهة والوثائق المتعلقة بهذا نادرة في أحسن الأحوال.
بمجرد الانتهاء من ذلك، يمكن تشغيل التعليمات البرمجية الخاصة بك بأي امتيازات تحتاجها، وتكون الطلبات عبر النطاقات بنفس سهولة إعادة تعيين أعلى النتائج في Mime-Sweeper.
أتمنى أن يساعدك هذا.