2008-09-05 15 views

Respuesta

12

Quickie

Si está utilizando puntos de vista de civil JSP (como es más común), entonces sólo tiene que añadir

<% response.setStatus(403); %> 

algún lugar de su archivo de vista. En la cima hay un lindo lugar.

Detalle

En MVC, i siempre habría establecer esta en la vista, y en la mayoría de los casos con Primavera-MVC, utilice el SimpleMappingExceptionResolver para presentar el punto de vista correcto en respuesta a una excepción de ejecución lanzado.

Por ejemplo: cree y ejecute un PermissionDeniedException en su controlador o capa de servicio y tenga el punto de resolución de excepciones en un archivo de vista permissionDenied.jsp. Este archivo de vista establece el estado 403 y muestra al usuario un mensaje apropiado.

En el archivo XML de frijol de primavera:

<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 es necesario implementar un mecanismo de inicio de sesión del usuario, echar un vistazo a Spring Security (anteriormente Acegi Seguridad).

+0

¿Por qué es necesario el response.setStatus? Después de la respuesta (en Tomcat), parece haber una cierta evolución del código de respuesta http de la respuesta: primero 200 (predeterminado), luego se mueve a 404 (por el bien del argumento) cuando el Spring DispatcherServlet procesa el excepción del controlador, la vista se representa y el código se establece en 500 (lo que es extraño) y, a continuación, el setStatus soluciona el problema al revertir el código de la respuesta a 404. – Eugen

5

puede usar response.setStatus (403)?

+0

Eso está funcionando para mí. – Jamesla

+0

@John el enlace proporcionado lamentablemente ya no funciona – BBerry

+0

@BBerry gracias por el aviso, se ha eliminado. 8 años lo harán con los enlaces. –

12

El uso de un ExceptionResolver es una gran manera de hacerlo, pero si solo desea que esto sea independiente de la vista, sin duda puede llamar al response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable"); en su Controlador.

17

Crear una excepción anotada con @ResponseStatus p. de esta manera:

@ResponseStatus(HttpStatus.FORBIDDEN) 
public class ForbiddenException extends RuntimeException { 
} 

Ahora acaba de lanzar la excepción de que en su método de control y la respuesta tendrá el estado 403.

19

También se puede simplemente tirar

org.springframework.security.access.AccessDeniedException("403 returned"); 

Esto devuelve un 403 en la respuesta encabezamiento.

+1

Esto funciona perfectamente y debería ser la respuesta aceptada porque es más flexible. – Heady

+0

@Heady: Realmente no es la mejor respuesta porque crea una fuerte dependencia con Spring Security. La respuesta de Joe, para crear su propia excepción, es la mejor OMI. Todavía lo voté porque es una alternativa decente. –

+0

Esto devuelve 500 para mí. – heez

Cuestiones relacionadas