2008-09-05 4 views

Antwort

12

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

+0

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

5

können Sie response.setStatus (403) verwenden?

+0

Das funktioniert für mich. – Jamesla

+0

@John der Link zur Verfügung gestellt ist leider nicht mehr funktioniert – BBerry

+0

@Berry danke für die heads-up, es wurde entfernt. 8 Jahre werden das tun, um zu verbinden. –

12

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.

17

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.

19

Sie können auch werfen Status nur

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

Dies gibt eine 403 in der Antwort Header.

+1

Das funktioniert perfekt und sollte funktionieren die akzeptierte Antwort, weil sie am flexibelsten ist. – Heady

+0

@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. –

+0

Dies ergibt eine 500 für mich. – heez