Domanda

Voglio che il mio controller restituisca il codice di risposta HTTP corretto quando l'utente non è autorizzato a visualizzare una determinata pagina.

È stato utile?

Soluzione

Sveltina

Se stai utilizzando semplici visualizzazioni JSP (come è più comune), aggiungi semplicemente

<% response.setStatus( 403 ); %>

da qualche parte nel file di visualizzazione.In cima è un bel posto.

Dettaglio

In MVC, lo imposterei sempre nella vista e, nella maggior parte dei casi con Spring-MVC, utilizzerei il file SimpleMappingExceptionResolver per presentare la vista corretta in risposta a un'eccezione di runtime generata.

Per esempio:creare e lanciare a PermissionDeniedException nel controller o nel livello di servizio e fare in modo che il risolutore di eccezioni punti a un file di visualizzazione permissionDenied.jsp.Questo file di visualizzazione imposta lo stato 403 e mostra all'utente un messaggio appropriato.

Nel file XML Spring Bean:

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

Se è necessario implementare un meccanismo di accesso utente, dai un'occhiata a Sicurezza primaverile (già Acegi Sicurezza).

Altri suggerimenti

Puoi anche semplicemente lanciare

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

Ciò restituisce un 403 nell'intestazione della risposta.

Crea un'eccezione annotata con @ResponseStatus per esempio.come questo:

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

Ora lancia semplicemente l'eccezione nel metodo del gestore e la risposta avrà lo stato 403.

Utilizzando un ExceptionResolver è un ottimo modo per procedere, ma se vuoi semplicemente che sia indipendente dalla vista, potresti sicuramente chiamare a response.sendError(HttpServletResponse.SC_FORBIDDEN, "AdditionalInformationIfAvailable"); nel controller.

Usa questo:response.setStatus(403).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top