Grails перехватывает все URL-адреса за исключением - PullRequest
0 голосов
/ 13 мая 2011

Я пытаюсь создать службу имитационного отдыха. В основном это два компонента. Мне нужен контроллер с действиями и представлениями, который позволяет мне создавать ResourceMappings, где я создаю отображение между URI и ложным ответом, который я передам обратно. Второй компонент - это универсальное отображение URL-адресов Grails для каждого другого URL-адреса, так что при попадании в URI этого приложения они будут отправлены моему контроллеру catch all, который вернет отображенный ответ, созданный ранее.

Например ... я перехожу на URL http://someserver.com:1234/restMapping/list. Этот URL является исключением из правила catch all. Это подводит меня к некоторым представлениям, которые позволяют мне создать карту URI для отдыха. Здесь я создаю отображение / mockservice / test и даю ему ответ «Это тест» с типом содержимого text / plain. Теперь, если я перейду к URL-адресу http://someserver.com:1234/mockservice/test, я должен нажать кнопку «поймать все», которая отправляет меня в контроллер, который возвращает страницу с типом содержимого text / plain и ответом «Это тест».

Я попробовал следующее, и это не похоже на работу. У кого-нибудь есть идеи?

static mappings = {

    "/$control/**" {
        controller = "catchAllHandler"
        action = "index"
        constraints {
            control(validator: {!['restMapping','css','js','images'].contains(it)})
        }
    }

    "/$controller/$action?/$id?"{

    }

    "/"(controller:"restMapping", action="index")
    "500"(view:'/error')
}

Интересно отметить, что когда я избавляюсь от ** и добавляю тонны дополнительных переменных, таких как $ s1? / $ S2? / $ S3? и т. д. тогда, кажется, работает. Проблема в том, что я не знаю, как долго ури пытается отобразить карту, поэтому я предпочел бы использовать **, чтобы перехватить все исключения, за исключением тех немногих, которые у меня есть.

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Я наконец понял это. Мне нужно было включить WEB-INF в мой список, чтобы исключить. Теперь я использую поле static exclude, а также валидатор для исключения определенных URL контроллера.

class UrlMappings {
static excludes = ["/images/*","/css/*","/js/*","/WEB-INF/*"]
static mappings = {

    "/restResourceMapping/$action?/$id?"{
        controller = "restMapping"
    }

    "/$control/?**" {
        controller = "catchAllHandler"
        action = "index"
        constraints {
            control(validator: {!['restMapping'].contains(it)})
        }
    }

    "/"(controller:"restMapping", action="index")
    "500"(view:'/error')
}
}

Я решил просто исключить все сопоставления URL-адресов, которые никогда не должны входить в мои остальные URL-адреса. К ним относятся / images, / css, / js и / WEB-INF. Теперь я могу создавать URL-адреса любой длины и отправлять их в мой контроллер catch для всех. Если человек переходит на базовый URL-адрес или набор URL-адресов restMapping, они будут перенаправлены на страницы с грубым доступом, где они смогут создавать новые сопоставления ресурсов отдыха. Если я хочу создать какие-либо другие контроллеры и представления, которые я хочу обойти, поймай все контроллеры, я могу просто добавить его в свой валидатор и заставить их работать нормально.

Также вы можете заметить, что я использую? в улове все сразу после /. Это, кажется, делает так, что мой улов все работает с URL, которые имеют только одно слово после имени сервера, как в http://server.com:1234/something.

0 голосов
/ 16 мая 2011

Я не уверен в этом, но я думаю, что порядок , в котором определяются сопоставления URL, важен. Поэтому попробуйте перечислить сопоставление URL для ваших особых случаев в начале закрытия сопоставлений, а затем перечислите общие (тот, который использует **). Дайте мне знать, если это работает:)

...