Подтвердить что ты не робот

Как вернуть 403 Запрещено в Spring MVC?

Я хочу, чтобы мой контроллер возвращал правильный HTTP-код ответа, когда пользователю не хватает разрешения на просмотр определенной страницы.

4b9b3361

Ответ 1

Недоброкачественная

Если вы используете простые JSP-представления (как это обычно бывает), просто добавьте

<% response.setStatus( 403 ); %>

где-нибудь в вашем файле вида. Вверху - хорошее место.

Detail

В MVC я всегда указывал бы это в представлении, и в большинстве случаев с Spring -MVC, используйте SimpleMappingExceptionResolver, чтобы представить правильный вид в ответ на запущенное Exception.

Например: создайте и выбросьте PermissionDeniedException на своем контроллере или на уровне обслуживания и попросите распознаватель исключения указать файл вида permissionDenied.jsp. Этот файл представления устанавливает статус 403 и показывает пользователю соответствующее сообщение.

В вашем XML файле Spring bean:

<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>

Если вам нужно реализовать механизм входа в систему, посмотрите Spring Безопасность (ранее Acegi Security).

Ответ 2

Вы также можете просто выбросить

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

Это возвращает 403 в заголовке ответа.

Ответ 3

Создать исключение, аннотированное с помощью @ResponseStatus, например. например:

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

Теперь просто выбросьте это исключение в метод обработчика, и ответ будет иметь статус 403.

Ответ 4

Использование ExceptionResolver - отличный способ, но если вы просто хотите, чтобы это было независимым от вида, вы могли бы сделать вызов response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable"); в своем контроллере.

Ответ 5

Используйте это: response.setStatus(403).