جعل الدعامات ترسل 500 خطأ خادم داخلي عند طرح الاستثناءات

StackOverflow https://stackoverflow.com//questions/9675507

  •  12-12-2019
  •  | 
  •  

سؤال

أنا أعمل على واجهة جافا سكريبت تمكين أجاكس الذي يجعل المكالمات إلى الخلفية جافا مكتوبة مع الدعامات.مشكلتي هي أنه عندما يلقي الخلفية استثناء ، العميل لا يزال يرى" 200 موافق "رمز استجابة هتب بدلا من" 500 خطأ الخادم الداخلي " مثل واحد يتوقع.

هذا هو التعثر لي مرارا وتكرارا لأن مكتبة جافا سكريبت العميل 3 طرف يعتمد على رموز الحالة هتب لتحديد ما إذا كان هناك شيء خاطئ مع مكالمة أجاكس ، كما تفعل معظم المكتبات الحديثة عادة.الأخطاء تمر دون أن يتم كشفها حتى ينفجر رمز بلدي عندما يحاول تحليل ما يمكن أن يكون عادة جسون.

أريد حقا لتجنب القرصنة مكتبة شبيبة موكلي من أجل التعامل مع هذه الأخطاء بأمان.حتى ذلك الحين, كيف يمكنني جعل الدعامات تعطيني 500 رمز الحالة عندما كان هناك استثناء غير معالج في الخلفية?لا ينبغي أن يكون هذا السلوك الافتراضي الدعامات ل?

تحرير: رمز العميل غير ذي صلة في هذه الحالة.أحتاج إلى إصلاح الخادم بحيث يرسل رمز الحالة المناسب عند حدوث استثناءات غير معالجة.شكراً!

هل كانت مفيدة؟

المحلول

أنا أحسب طريقة واحدة للقيام بذلك.لست متأكدا مما إذا كان الأفضل أو الأسهل ، لكنه يعمل.لقد وجدت الدعامات دليل تكوين الاستثناء وأضاف ما يلي إلى بلدي <package> داخل struts.xml:

<global-results>
  <result name="exception">/exception.jsp</result>
</global-results>

<global-exception-mappings>
  <exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>

يؤدي هذا إلى إعادة توجيه جميع الاستثناءات غير المعالجة إلى /exception.jsp.وهنا محتويات جسب:

<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="application/json; charset=UTF-8" %>
<% response.setStatus(500); %>
{"success": false,"errors": "<s:property value="%{exception.message}"/>"}

ستلاحظ على السطر 3 أنني يدويا تعيين رمز الاستجابة إلى 500.

هذا أعطاني مشكلة جديدة:لم يتم تسجيل الاستثناءات بعد الآن.كما هو مقترح في دليل الدعامات المذكور أعلاه ، قمت بحل هذا عن طريق إضافة ما يلي إلى بلدي <package> في struts.xml كذلك:

<interceptors>
    <interceptor-stack name="appDefaultStack">
        <interceptor-ref name="defaultStack">
            <param name="exception.logEnabled">true</param>
             <param name="exception.logLevel">ERROR</param>
        </interceptor-ref>
    </interceptor-stack>
</interceptors>

<default-interceptor-ref name="appDefaultStack" />

الدعامات:-1 لجعل مثل هذه الميزة بسيطة وواضحة لا الافتراضي ، وآخر -1 لجعل الحل منفرجة جدا.

نصائح أخرى

تحديث : لقد قمت بإصلاح قسم GransoSodicetagCode (الذي كان في عداد المفقودين علامة httpheader)

أحب الحل الخاص بك أفضل، ولكن هناك طريقة أخرى يمكنك القيام بذلك إذا كنت لا ترغب في الفوضى / إعداد رأس الاستجابة في JSP.

  1. في struts.xml، قم بإنشاء تعيين استثناء عالمي من "java.lang.exception" نتيجة تسمى "استثناء"
  2. في struts.xml، قم بإنشاء نتيجة عالمية تقوم بخرائط "استثناء" إلى نتيجة httpheader بقيمة 500.
  3. في web.xml ، قم بإنشاء إدخال صفحة خطأ يقوم بخرائط رمز الخطأ 500 إلى موقع صفحة الخطأ الخاص بك.
  4. لذلك، بالنسبة إلى struts.xml:

    giveacodicetagpre.

    و web.xml

    giveacodicetagpre.

    هذا يعمل ولكن لديه بعض السقوط الكبيرة. يتم تقديم حاوية Servlet صفحة الخطأ (وليس الدعامات) حتى تتمكن من الوصول إلى رسالة الخطأ الأصلية أو Valuestack Struts. سيظل تسجيل الاستثناءات العمل، ومع ذلك (إذا كنت قد قمت بتمكينها).

    جانبا، أنا أيضا أن أجد أنه يحير أن الدعامات يجعل هذا صعبا للغاية. في كل إطار آخر تعاملت مع مفهوم إرجاع صفحة خطأ و رمز الخطأ هو تافهة جميلة للتنفيذ.

خطأ الخادم الداخلي 500 هو خطأ جانب الخادم، مما يعني أن المشكلة ربما تكون مع جهاز الكمبيوتر الخاص بك أو اتصال الإنترنت ولكن بدلا من ذلك هو مشكلة في خادم موقع الويب.

هناك إشارة إلى التعامل مع هذا في جانب العميل.في خادم الويب (خادم HTTP) تم تكوينه في التعامل مع الطلبات.

لم تذكر مكتبة شبيبة التي تستخدمها.أود أن أقترح قراءة الوثائق بعناية.إذا كان لديه نوع من طريقة رد الاتصال ، فيجب أن يحتوي على بعض responseText بخلاف responseCode.عندما يحدث بعض استثناءات التحقق من الصحة في جانب الخادم ، قم بتمرير رسالة خطأ أيضا.فقط لا تعتمد على رمي بعض الاستثناءات ، لأنك تستخدم أجاكس.يمكنك تتبع ذلك responseText لإظهار بعض الرسائل مثل"فشل التحقق من الصحة لهذا السبب ، يرجى المحاولة مرة أخرى".توافق ?

رمي خلاف ذلك ويبابليكاتيونكسيبتيون قبل الالتزام بالرد:

throw new javax.ws.rs.WebApplicationException();  // or by any other constructor

هنا هو جرة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top