سؤال

أريد أن تقوم وحدة التحكم الخاصة بي بإرجاع رمز استجابة HTTP الصحيح عندما يفتقر المستخدم إلى الإذن لعرض صفحة معينة.

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

المحلول

ضربة سريعة

إذا كنت تستخدم طرق عرض JSP عادية (كما هو شائع)، فقم ببساطة بإضافة

<% response.setStatus( 403 ); %>

في مكان ما في ملف العرض الخاص بك.في الأعلى مكان جميل.

التفاصيل

في MVC، أقوم دائمًا بتعيين هذا في العرض، وفي معظم الحالات مع Spring-MVC، استخدم SimpleMappingExceptionResolver لتقديم العرض الصحيح ردًا على استثناء وقت التشغيل الذي تم طرحه.

على سبيل المثال:إنشاء ورمي أ PermissionDeniedException في وحدة التحكم أو طبقة الخدمة الخاصة بك واجعل محلل الاستثناء يشير إلى ملف عرض permissionDenied.jsp.يقوم ملف العرض هذا بتعيين الحالة 403 ويظهر للمستخدم الرسالة المناسبة.

في ملف Spring Bean XML:

<bean id="exceptionResolver"
      class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
    <props>
      <prop key="PermissionDeniedException">          
        rescues/permissionDenied
      </prop>
      ... set other exception/view mappings as <prop>s here ...
    </props>
  </property>
  <property name="defaultErrorView" value="rescues/general" />
</bean>

<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
  <property name="prefix" value="/WEB-INF/views/" />
  <property name="suffix" value=".jsp" />
</bean>

إذا كنت بحاجة إلى تنفيذ آلية تسجيل دخول المستخدم، فقم بإلقاء نظرة على أمن الربيع (سابقًا Acegi Security).

نصائح أخرى

يمكنك أيضًا رميها فقط

org.springframework.security.access.AccessDeniedException("403 returned");

يؤدي هذا إلى إرجاع 403 في رأس الاستجابة.

قم بإنشاء استثناء مشروح بـ @حالة الاستجابة على سبيل المثالمثله:

@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}

الآن فقط قم بطرح هذا الاستثناء في طريقة المعالج الخاصة بك وستكون الاستجابة بالحالة 403.

باستخدام ExceptionResolver إنها طريقة رائعة للمضي قدمًا، ولكن إذا كنت تريد فقط أن يكون هذا مستقلاً عن العرض، فيمكنك بالتأكيد الاتصال به response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable"); في وحدة التحكم الخاصة بك.

استخدم هذا:response.setStatus(403).

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