¿Cómo devuelvo un 403 prohibido en Spring MVC?
Pregunta
Quiero que mi controlador devuelva el código de respuesta HTTP correcto cuando el usuario no tenga permiso para ver una página en particular.
Solución
Cosa hecha rápidamente
Si está utilizando vistas JSP simples (como es más común), simplemente agregue
<% response.setStatus( 403 ); %>
en algún lugar de su archivo de visualización.En la cima hay un lugar agradable.
Detalle
En MVC, siempre configuraría esto en la vista y, en la mayoría de los casos, con Spring-MVC, usaría el SimpleMappingExceptionResolver
para presentar la vista correcta en respuesta a una excepción de tiempo de ejecución lanzada.
Por ejemplo:crear y lanzar un PermissionDeniedException
en su controlador o capa de servicio y haga que el solucionador de excepciones apunte a un archivo de vista permissionDenied.jsp
.Este archivo de vista establece el estado 403 y muestra al usuario un mensaje apropiado.
En su archivo 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>
Si necesita implementar un mecanismo de inicio de sesión de usuario, eche un vistazo a Seguridad de primavera (antes Acegi Seguridad).
Otros consejos
También puedes simplemente tirar
org.springframework.security.access.AccessDeniedException("403 returned");
Esto devuelve un 403 en el encabezado de respuesta.
Crear una excepción anotada con @EstadoRespuesta p.ej.como esto:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
Ahora simplemente lanza esa excepción en tu método de controlador y la respuesta tendrá el estado 403.
Usando un ExceptionResolver
es una excelente manera de hacerlo, pero si solo desea que esto sea independiente de la vista, ciertamente puede hacer una llamada a response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
en su controlador.
Utilizar esta:response.setStatus(403)
.