ما المقصود بمشاركة الموارد متعددة الأصول (CORS) - كيف تضيفها إلى خادم الويب الخاص بجافا جيرسي؟
نشرت: 2014-07-19 كيف يتم إصلاح هذا الخطأ أثناء client-server
؟ يرسل الخادم البيانات بتنسيق JSON أو XML ويلقي العميل أسفل الاستثناء.
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
يمكن لصفحات الويب العادية استخدام كائن XMLHttpRequest لإرسال البيانات واستلامها من الخوادم البعيدة ، لكنها مقيدة بنفس سياسة الأصل. الامتدادات ليست محدودة للغاية. يمكن للإضافة التحدث إلى الخوادم البعيدة خارج أصلها ، طالما أنها تطلب أولاً أذونات عبر الأصل.
أيضًا ، إذا كانت لديك أسئلة أدناه ، فأنت في الموقع الصحيح:
- فهم مشاركة الموارد متعددة الأصول (مرشحات CORS)
- هل يمكنني استخدام مشاركة الموارد عبر الأصول
- كيفية تمكين مشاركة الموارد عبر الأصول
- ما هو نطاق Ajax مع مشاركة الموارد عبر الأصول
- ما هو التحكم في الوصول HTTP (CORS)
CORS (مشاركة الموارد عبر الأصل) هي آلية يدعمها W3C لتمكين الطلبات عبر الأصل في متصفحات الويب. يتطلب CORS دعمًا من كل من المتصفح والخادم للعمل. هذا هو تنفيذ عامل تصفية Java Jersey Web Server من CORS من جانب الخادم لحاويات الويب مثل Apache Tomcat وخوادم الويب المضمنة الأخرى.
الخطوة 1:
يمكن أن تتضمن الاستجابة رأس Access-Control-Allow-Origin ، مع أصل مصدر الطلب كقيمة ، للسماح بالوصول إلى محتويات المورد. يتحقق وكيل المستخدم من تطابق قيمة وأصل مصدر الطلب.
الخطوة 2:
يمكن لوكلاء المستخدم أن يكتشفوا من خلال طلب الاختبار المبدئي ما إذا كان مورد متعدد المنشأ جاهزًا لقبول الطلبات ، باستخدام طريقة غير بسيطة ، من أصل معين. تم التحقق من صحة هذا مرة أخرى من قبل وكيل المستخدم.
الخطوه 3:
يتم تمكين التطبيقات من جانب الخادم لاكتشاف أن طلب HTTP قد تم اعتباره طلبًا عبر الأصل من قبل وكيل المستخدم ، من خلال عنوان Origin. يمكّن هذا الامتداد التطبيقات من جانب الخادم من فرض قيود (مثل عدم إرجاع أي شيء) على الطلبات عبر الأصل التي يرغبون في خدمتها.
لنبدأ الآن بالأمثلة.
مثال 1: خادم الويب Java Jersey
قبل أسبوعين ، كتبت مقالًا عن كيفية بدء تشغيل خادم HTTP Jersey أثناء بدء تشغيل تطبيق Java. سيغطي هذا المنشور خطوات حول كيفية إضافة عامل تصفية CORS إلى خادم Jersey نفسه.
نحن بحاجة إلى تمديد ContainerResponseFilter. واجهة تنفذ بواسطة مرشحات استجابة الحاوية. بشكل افتراضي ، على سبيل المثال ، إذا لم يتم تطبيق ربط اسم على فئة تنفيذ عامل التصفية ، فسيتم تطبيق مثيل المرشح بشكل عام على أي استجابة صادرة.
لإصلاح هذا ، دعونا نحاول إضافة 4 رؤوس أدناه إلى استجابة الخادم:
- التحكم في الوصول والسماح بالأصل
- طرق التحكم في الوصول والسماح
- التحكم في الوصول ، الحد الأقصى للعمر
- الوصول والتحكم والسماح الرؤوس
كود مرشح CORS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
التعديل في JerseyEmbeddedHTTPServerCrunchify.java من البرنامج التعليمي السابق.

فقط أضف السطر أدناه في createHttpServer () وأعد تشغيل الخادم.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
نتيجة:
http: // localhost: 8085 / api
هنا تفاصيل الرؤوس.
مثال 2: خادم Apache HTTP
لعرض الرأس ، يمكنك إضافة السطر التالي داخل أقسام <Directory> و <الموقع> و <الملفات> ، أو داخل ملف .htaccess
.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
مثال 3: يمكن لخادم .NET تكوين هذا في web.config على النحو التالي
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
مثال 4: لرصيف المراكب الصغيرة (7 وما فوق)
قم بتضمين jetty-servlets JAR في WEB-INF / lib الخاص بك وادمجها في WEB-INF / web.xml الخاص بك
1 2 3 4 5 6 7 8 |
< filter > < filter - name > cross - origin < / filter - name > < filter - class > org . eclipse . jetty . servlets . CrossOriginFilter < / filter - class > < / filter > < filter - mapping > < filter - name > cross - origin < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
مثال 5: Apache Tomcat Server (v 7.0.41 +)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
مثال 6: في PHP
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
يُرجى إعلامي إذا كان لديك أي أسئلة أخرى حول هذا الموضوع. يمكن العثور على قائمة بجميع دروس Java التعليمية هنا.