Ich möchte, dass mein Controller den richtigen HTTP-Antwortcode zurückgibt, wenn der Benutzer keine Berechtigung zum Anzeigen einer bestimmten Seite hat.Wie kann ich eine 403 Forbidden in Spring MVC zurückgeben?
Antwort
Quickie
Wenn Sie Normal JSP Ansichten verwenden (wie die meisten üblich ist), dann fügen Sie einfach
<% response.setStatus(403); %>
irgendwo in Ihrer View-Datei. An der Spitze ist ein schöner Ort.
Details
In MVC, ich würde dies in der Ansicht immer gesetzt, und in den meisten Fällen mit Frühling-MVC, verwenden Sie die SimpleMappingExceptionResolver
die richtige Ansicht in Reaktion auf eine geworfene Laufzeit Ausnahme darzustellen.
Zum Beispiel: Erstellen und werfen Sie eine PermissionDeniedException
in Ihrem Controller oder Service-Schicht und haben die Ausnahme Resolver-Punkt auf eine View-Datei permissionDenied.jsp
. Diese Ansichtsdatei setzt den 403-Status und zeigt dem Benutzer eine entsprechende Nachricht an.
In Ihrem Spring-Bean-XML-Datei:
<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>
Wenn Sie einen Benutzer-Login-Mechanismus implementieren müssen, werfen Sie einen Blick auf Spring Security (ehemals Acegi Security).
Die Verwendung einer ist ein guter Weg zu gehen, aber wenn Sie nur wollen, dass diese Ansicht unabhängig ist, können Sie sicherlich einen Anruf an response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
in Ihrem Controller machen.
Erstellen Sie eine mit @ResponseStatus, z. wie folgt aus:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
nun diese Ausnahme in Ihrem Handler-Methode nur werfen und die Antwort wird 403.
Sie können auch werfen Status nur
org.springframework.security.access.AccessDeniedException("403 returned");
Dies gibt eine 403 in der Antwort Header.
Das funktioniert perfekt und sollte funktionieren die akzeptierte Antwort, weil sie am flexibelsten ist. – Heady
@Heady: Nicht wirklich die beste Antwort, weil es eine starke Abhängigkeit mit Spring Security erzeugt. Joe's Antwort, um deine eigene Exception zu erstellen, ist die beste IMO. Ich habe das immer noch aufgewertet, weil es eine anständige Alternative ist. –
Dies ergibt eine 500 für mich. – heez
Warum ist der response.setStatus erforderlich? Nach der Antwort (in Tomcat) scheint es eine gewisse Evolution des HTTP-Antwortcodes der Antwort zu geben - sie ist zuerst 200 (Standard), dann geht sie zum 404 (wegen des Arguments), wenn das Spring DispatcherServlet die Antwort verarbeitet handler exception, dann wird die Ansicht gerendert und der Code wird auf 500 gesetzt (was merkwürdig ist), und dann repariert setStatus das Problem, indem er den Code der Antwort zurück auf 404 zurücksetzt. – Eugen