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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top