Comment puis-je retourner un 403 Forbidden dans Spring MVC?
Question
Je veux que mon contrôleur pour revenir au droit code HTTP de la réponse lorsque l'utilisateur ne dispose pas de l'autorisation d'afficher une page en particulier.
La solution
Quickie
Si vous utilisez de la plaine JSP points de vue (comme la plupart des communes), puis il suffit d'ajouter
<% response.setStatus( 403 ); %>
quelque part dans votre fichier de vue.Au sommet se trouve un endroit agréable.
Détail
Dans MVC, je serais toujours dans la vue, et dans la plupart des cas avec Spring-MVC, utilisez la SimpleMappingExceptionResolver
pour présenter la vue correcte en réponse à la levée d'une Exception d'exécution.
Par exemple:créer et lancer un PermissionDeniedException
dans votre contrôleur ou de la couche de service et avez l'exception de résolution point de vue de fichier permissionDenied.jsp
.Ce point de vue des ensembles de fichier de l'état 403 et indique à l'utilisateur un message approprié.
Au Printemps de haricots fichier XML:
<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 vous avez besoin de mettre en œuvre un utilisateur mécanisme de connexion, jetez un oeil à Printemps De Sécurité (anciennement Acegi Security).
Autres conseils
Vous pouvez aussi jeter
org.springframework.security.access.AccessDeniedException("403 returned");
Cette fonction retourne une 403 dans l'en-tête de réponse.
Créer une Exception annoté avec @ResponseStatus par exemplecomme ceci:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
Maintenant, il suffit de jeter cette Exception dans votre méthode de gestionnaire et de la réponse de l'état 403.
À l'aide d'un ExceptionResolver
est un excellent moyen d'aller, mais si vous voulez que ce soit indépendant de la vue, vous pourriez certainement faire appel à response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
dans votre Contrôleur.
Utilisez ceci:response.setStatus(403)
.