Как исключить определенные ключевые слова из UrlMapping в Grails?

Я использую следующее сопоставление URL-адресов в Grails:

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

для сопоставления URL-адресов, таких как mydomain.com/someusername

Как прикрепить ограничения к сопоставлению URL-адресов, чтобы исключить такие ключевые слова, как «вход», «выход»,...

То есть mydomain.com/someusername должен направлять на mydomain.com/user/show/someusername, mydomain.com/login не должен направлять на mydomain.com/user/show/login.


person confile    schedule 09.06.2013    source источник
comment
Что вы имели в виду под user/show/login? Является ли login действием?   -  person dmahapatro    schedule 09.06.2013
comment
mydomain.com/someusername должен направлять на mydomain.com/user/show/someusername, mydomain.com/login не должен направлять на mydomain.com/user/show/login.   -  person confile    schedule 09.06.2013


Ответы (3)


Вы можете использовать ограничения для этого сопоставления:

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

Используйте фильтр и выполняйте перенаправление с него.

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

Если вы хотите сделать его специфичным для контроллера или действия, используйте его имя вместо '*'.

Подробнее:

person Elias Dorneles    schedule 09.06.2013

Я делал подобные вещи для конечных точек на основе REST много раз, и Grails достаточно умен, чтобы понять, что вы хотите. Обратите внимание, что порядок в файле UrlMappings может быть важен.

Например, вы можете определить это:

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

Затем, когда вы нажмете «/login», вы перейдете к методу auth:login, но когда вы нажмете «/userid», вы будете отправлены пользователю: view: userid, как и ожидалось.

person Brad Lee    schedule 22.01.2016