2012-01-22 5 views
8

Ho un metodo nel mio controller come questo:Spring 3.x - Come faccio a reindirizzare da una mappatura che restituisce i dati?

@RequestMapping(value="getData", method=RequestMethod.GET) 
@ResponseBody 
public List<MyDataObj> getData() 
{ 
    return myService.getData(); 
} 

I dati vengono restituiti come JSON o xsl, a seconda della richiesta.

Se la persona che effettua la richiesta non è autorizzato ad accedere ai dati che ho bisogno di reindirizzare l'utente a una pagina "non autorizzato", in modo da qualcosa di simile:

@RequestMapping(value="getData", method=RequestMethod.GET) 
@ResponseBody 
public List<MyDataObj> getData() 
{ 
    if (!isAuthorized()) 
    { 
    // redirect to notAuthorized.jsp 
    } 
    return myService.getData(); 
} 

Tutti gli esempi che ho visto l'utilizzo di Spring richiede il metodo per restituire uno String o uno ModelAndView. Ho pensato di utilizzare HttpServletResponse.sendRedirect() ma tutti i miei JSP sono in WEB-INF e non possono essere raggiunti direttamente.

Come negare l'accesso con garbo all'URL della richiesta dati?

risposta

5

Una soluzione più elegante può essere to use a HandlerInterceptor che consente di verificare l'autorizzazione, bloccando eventuali richieste che non sono autorizzati a procedere. Se la richiesta raggiunge il tuo controller, puoi supporre che sia OK.

+0

Questo non ha funzionato perché ho il mio metodo annotato con '@ ResponseBody'. Tutto ciò che ho ottenuto con l'oggetto 'RedirectView' in JSON. Sto guardando il 'HandlerInterceptor' ora. – Paul

+0

@Paul: buon punto. Ho modificato la mia risposta per rimuovere quel bit. – skaffman

+1

Ho dovuto rielaborare la mia struttura di directory un po '(avevo tutto sotto '/') ma usare un intercettore funzionava alla grande, grazie. – Paul

1

Un altro approccio è il filtro. È possibile spostare tutta la logica di sicurezza nel filtro e mantenere il codice pulito nei controller.

0

Abbastanza semplice:

Invia uno stato di errore al client

response.setStatus(HttpServletResponse.SC_NO_CONTENT); 

e gestire lo stesso con voi AJAX gestore di callback e reindirizzare. :)

+0

Non sto usando Ajax qui. – Paul

+0

Se non ci sono Ajax allora come e-zinc e skaffman hai suggerito di andare per il prehandle, controllare l'autorizzazione e usare la vista di reindirizzamento. – Abhi

4

La risposta è qui sotto. Ma il tuo caso particolare preferirebbe gestire un altro approccio.

@RequestMapping(value = "/someUrl", method = RequestMethod.GET) 
@ResponseBody 
public Response someMethod(String someData, HttpServletResponse response){ 
    if(someData=="redirectMe"){ 
     response.sendRedirect(ppPageUrl); 
    } 
... 
} 
Problemi correlati