Я хочу, чтобы мой контроллер возвращал правильный HTTP-код ответа, когда пользователю не хватает разрешения на просмотр определенной страницы.
Как вернуть 403 Запрещено в Spring MVC?
Ответ 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)
.