วิธีเรียกใช้ Flex SWF จากโดเมนระยะไกลโดยใช้ Flash (AS3)
หากคุณเคยทำงานกับ Flash และ Flex คุณอาจเคยพบกับ SecurityError
ที่น่ากลัวเมื่อพยายามเรียกใช้ไฟล์ SWF จากโดเมนที่แตกต่างกัน ข้อผิดพลาดนี้โดยเฉพาะ คือ Error #2119
สามารถเป็นอุปสรรคในการพัฒนาแอปพลิเคชันของคุณ ทำให้ไม่สามารถทำงานร่วมกันระหว่าง SWF ที่โฮสต์ในโดเมนที่แตกต่างกันได้ วันนี้เราจะมาดำดิ่งถึงปัญหาและสำรวจวิธีที่คุณสามารถจัดการกับปัญหานี้ได้อย่างมีประสิทธิภาพโดยใช้ ActionScript 3 (AS3).
ปัญหา: การละเมิด Security Sandbox
ลองนึกภาพว่าคุณมี Flex SWF ที่โฮสต์อยู่บนโดเมนหนึ่ง เช่น http://www.a.com/a.swf
และคุณต้องการโหลด SWF อื่น http://services.nuconomy.com/n.swf
จากโดเมนอื่น โค้ดของคุณอาจมีลักษณะคล้ายดังนี้:
_loader = new Loader();
var req:URLRequest = new URLRequest("http://services.nuconomy.com/n.swf");
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderFinish);
_loader.load(req);
อย่างไรก็ตาม เมื่อดำเนินการ คุณจะได้รับข้อยกเว้นดังต่อไปนี้:
SecurityError: Error #2119: Security sandbox violation: caller http://localhost.service:1234/flashTest/Main.swf cannot access LoaderInfo.applicationDomain owned by http://www.b.com/b.swf.
ข้อผิดพลาดนี้มักเกิดขึ้นเพราะ Flash Player บังคับให้มีข้อจำกัดด้านความปลอดภัยของ Sandbox ซึ่งป้องกันไม่ให้ไฟล์ SWF ที่ให้บริการจากโดเมนที่แตกต่างกันโต้ตอบกันได้โดยตรง.
วิธีแก้ปัญหา: การอนุญาตการเข้าถึงด้วย Security.allowDomain()
เพื่อให้สามารถเข้าถึงข้ามโดเมนได้ คุณจำเป็นต้องอนุญาตอย่างชัดเจนโดยใช้วิธี Security.allowDomain()
ใน ActionScript วิธีการตั้งค่านี้อย่างมีประสิทธิภาพมีดังนี้:
ขั้นตอนที่ 1: แก้ไข SWF ที่คุณพยายามโหลด
ในไฟล์ SWF ที่คุณพยายามโหลด (เรียกว่าคือ http://services.nuconomy.com/n.swf
) คุณจำเป็นต้องรวมโค้ดบล็อกต่อไปนี้:
import flash.system.Security;
// อนุญาตโดเมนที่จะโต้ตอบกับ SWF นี้
Security.allowDomain("http://localhost.service:1234");
ขั้นตอนที่ 2: ใช้งาน Security.allowDomain() อย่างถูกต้อง
- หลายโดเมน: หากแอปพลิเคชันของคุณต้องการอนุญาตการเข้าถึงจากโดเมนต่างๆ คุณสามารถเรียก
Security.allowDomain()
หลายครั้งสำหรับแต่ละโดเมน. - แนวทางปฏิบัติที่ดีที่สุด: ควรระมัดระวังในการใช้
allowDomain()
โดยหลีกเลี่ยงการใช้มากเกินไป เนื่องจากอาจทำให้ไฟล์ SWF ของคุณเสียความปลอดภัย เพียงอนุญาตโดเมนที่เชื่อถือได้.
ขั้นตอนที่ 3: ทดสอบการกำหนดค่า
เมื่อคุณอัปเดตโค้ด SWF แล้ว คุณสามารถรันแอปพลิเคชันอีกครั้ง หากทุกอย่างถูกตั้งค่าอย่างถูกต้อง คุณควรจะสามารถโหลดคลาสจาก SWF ระยะไกลได้โดยไม่มีการละเมิดด้านความปลอดภัยใดๆ.
แหล่งข้อมูลเพิ่มเติม
เพื่อความเข้าใจเพิ่มเติม คุณสามารถดูเอกสารที่ครอบคลุมของ Adobe เกี่ยวกับความปลอดภัยใน Flash ได้ ดู The Adobe Flex 3 Programming ActionScript 3 PDF โดยเฉพาะบทที่ 27 ซึ่งครอบคลุมถึงความปลอดภัยใน Flash Player และการข้ามสคริปต์.
สรุป
การพบกับการละเมิด sandbox ด้านความปลอดภัยอาจทำให้หงุดหงิดโดยเฉพาะเมื่อคุณพยายามที่จะนำเสนอฟีเจอร์ที่เพิ่มขีดความสามารถในการทำงานของแอปพลิเคชันของคุณ โชคดีที่ด้วยวิธี Security.allowDomain()
คุณสามารถจัดการกับข้อจำกัดเหล่านี้ได้ง่ายและเปิดใช้งานการสื่อสารที่ราบรื่นระหว่าง SWF จากโดเมนที่แตกต่างกัน ดำเนินการอย่างระมัดระวังและตรวจสอบการอนุญาตเฉพาะโดเมนที่เชื่อถือได้เท่านั้น แล้วคุณจะประสบความสำเร็จในการรวมระบบ.
อย่าลืมว่าการปฏิบัติตามแนวทางการเขียนโค้ดอย่างปลอดภัยเป็นสิ่งสำคัญสำหรับการรักษาความสมบูรณ์ของแอปพลิเคชันของคุณในสภาพแวดล้อมที่เชื่อมต่อ.