Wie gebe ich eine 403 Forbidden in Spring MVC?
Frage
Ich möchte meinen controller zurückgeben, den richtigen HTTP-response-code, wenn der Benutzer keine Berechtigung zum anzeigen einer bestimmten Seite.
Lösung
Quickie
Wenn Sie mit einfachen JSP-Ansichten (wie fast üblich), dann fügen Sie einfach
<% response.setStatus( 403 ); %>
irgendwo in Ihrer view-Datei.An der Spitze ist ein schöner Ort.
Detail
In MVC, würde ich setzen Sie diese immer im Blick und in den meisten Fällen mit Spring-MVC, verwenden Sie die SimpleMappingExceptionResolver
präsentieren Sie die richtige Ansicht in der Antwort zu einer ausgelösten Exception zur Laufzeit.
Zum Beispiel:erstellen Sie und werfen Sie ein PermissionDeniedException
in Ihrem controller oder service-Schicht und die Ausnahme-resolver zeigen Sie auf eine view-Datei permissionDenied.jsp
.Diese Ansicht Datei legt den 403-status und zeigt dem Benutzer eine entsprechende Meldung.
In Ihrer 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 implementieren müssen, um eine Benutzer-login-Mechanismus, werfen Sie einen Blick auf Spring Security (vormals Acegi Security).
Andere Tipps
Sie können auch nur werfen
org.springframework.security.access.AccessDeniedException("403 returned");
Dies gibt eine 403-in der Antwort-header.
Erstellen Sie eine Ausnahme kommentiert mit @ResponseStatus z.B.wie diese:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {
}
Jetzt werfen, dass die Ausnahme in der handler-Methode und die Antwort haben-Statuscode 403.
Mit einem ExceptionResolver
ein guter Weg zu gehen, aber wenn Sie wollen einfach nur diese zu Ansicht-unabhängig ist, können Sie sicher rufen Sie response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable");
in Ihrem Controller.
Benutzen Sie diese:response.setStatus(403)
.