java - springframework - spring framework tutorial
¿Cómo devuelvo un 403 Forbidden en Spring MVC? (5)
Cree una excepción anotada con @ResponseStatus por ej. De esta manera:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
Ahora solo tira esa Excepción en tu método de manejo y la respuesta tendrá el estado 403.
Quiero que mi controlador devuelva el código de respuesta HTTP correcto cuando el usuario no tiene permiso para ver una página en particular.
Usar un ExceptionResolver
es una gran manera de hacerlo, pero si solo desea que esto sea independiente de la vista, puede realizar una llamada a response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
en tu controlador.
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 tu archivo de vista. En la cima hay un lindo lugar.
Detalle
En MVC, siempre configuro esto en la vista, y en la mayoría de los casos con Spring-MVC, uso SimpleMappingExceptionResolver
para presentar la vista correcta en respuesta a una excepción de tiempo de ejecución arrojado.
Por ejemplo: crea y lanza una PermissionDeniedException
en tu controlador o capa de servicio y haz que el punto de resolución de excepciones sea 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 Spring Security (anteriormente Acegi Security).
¿Puedes usar response.setStatus (403)?
También puedes simplemente tirar
org.springframework.security.access.AccessDeniedException("403 returned");
Esto devuelve un 403 en el encabezado de respuesta.