Вопрос

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

Это было полезно?

Решение

Быстрый

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

<% response.setStatus( 403 ); %>

где-то в вашем файле просмотра.Наверху красивое место.

Деталь

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

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

В XML-файле компонента Spring:

<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 напримертак:

@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