2013-06-09 15 views
5

Io uso il seguente mappatura URL in Grails:Come escludere parole chiave specifiche da UrlMapping in Grails?

"/$id"{ 
    controller = "user" 
    action = "show" 
}  

per mappare gli URL come mydomain.com/someusername

Come posso allegare vincoli alla mappatura URL per escludere parole chiave come "login", "logout", ...

Vale a dire, mydomain.com/someusername l'instradamento di mydomain.com/user/show/someusername, mydomain.com/login non effettuare l'instradamento di mydomain.com/user/show/ accesso.

+0

Cosa intendevi per * utente/mostra/login *? 'Login' è un'azione? – dmahapatro

+0

mydomain.com/someusername deve essere indirizzato a mydomain.com/user/show/someusername, mydomain.com/login non deve essere indirizzato a mydomain.com/user/show/login. – confile

risposta

14

È possibile utilizzare contrainsts per questa mappatura:

"/$id"{ 
    controller = "user" 
    action = "show" 
    constraints { 
    //add a validator for $id from url mapping 
    id(validator: { 
     return !(it in ['login', 'logout']) 
    }) 
    } 
}  
+0

è bello, non sapevo che avresti potuto farlo! :) – elias

2

Utilizzare un filter e reindirizzare da esso.

class UrlMappingFilters { 
    def filters = { 
     filterUrlKeywords(controller: '*', action: '*') { 
      def keywords = ['login', 'logout'] 
      before = { 
       if (params.id in keywords) { 
        // redirect to start, or render error... 
        redirect(uri: '/') 
        return false 
       } 
      } 
     } 
    } 
} 

Se si vuole rendere specifica a un controller o azione, usare il suo nome invece del '*'.

Per saperne di più:

1

ho fatto questo tipo di cose per gli endpoint REST base numerose volte, e Grails è abbastanza intelligente da capire ciò che vuoi. Si noti che l'ordine nel file UrlMappings può essere importante.

Ad esempio, è possibile definire questo:

class UrlMappings { 
    static mappings = { 
     "/login" { controller: 'auth', action: 'login' } 
     "/logout" { controller: 'auth', action: 'logout' } 
     "/$id" { controller: 'user', action: 'view' } 
    } 
} 

Poi, quando si preme "/ login" si andrà nella auth: metodo di login, ma quando si colpisce "/ userid" vi verrà inviato a utente: visualizza: userid come previsto.