Grails выдает ошибку 404 при отмене запроса страницы с фильтром - PullRequest
3 голосов
/ 27 марта 2012

У меня есть фильтр:

class MyFilters {
    def filters = {
        before = {
            render(view: "/test")
            return false
        }
    }
}

Это прекрасно работает на страницах, где я использую контроллер для обработки запроса, показывая содержимое test.gsp вместо страницы, которую я запросил.Однако, когда я пытаюсь получить доступ к странице, которая отображается непосредственно в файл GSP, я получаю ошибку 404.

Изменение рендера на просто render "test" дает те же результаты, что и комментирование и просто выходreturn false.

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Grails - это структура MVC. Если вы хотите отобразить URL-адрес непосредственно на GSP (без перенаправления через контроллер и действие), вам нужно объяснить это гралям внутри UrlMappings.groovy. Там вы можете определить свои «ярлыки». E.g.:

static mappings = {
    "/$viewName"(view:"/index") {
        constraints {
            viewName([some constraints])
        }
    }
}

Который будет рендерить views/index.gsp без прохождения через контроллер. Если вы НЕ определяете отображение контроллера (или, по крайней мере, отображение представления) для этих URL-адресов, вы НЕ МОЖЕТЕ использовать фильтры grails:

Если вы действительно хотите перехватить ВСЕ запросы, вы можете добавить фильтр сервлетов в ваше приложение Grails, например:

import javax.servlet.*

import org.springframework.web.context.support.WebApplicationContextUtils;

class TestFilter implements Filter {

    def applicationContext

    void init(FilterConfig config) throws ServletException {
        applicationContext = WebApplicationContextUtils.getWebApplicationContext(config.servletContext)
    }

    void destroy() {
    }

    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        System.out.println("this filter has been called");
    }
}

Здесь вы можете выполнять перенаправление или рендеринг на основе applicationcontext и текущего request.

Вам необходимо добавить этот фильтр в web.xml. О том, как это сделать, рассмотрите: Как мне использовать сервлет в моем приложении Grails?

0 голосов
/ 29 марта 2012

Вы можете легко установить код состояния http с помощью аргумента состояния метода визуализации Grails

Я не проверял это с фильтрами, но с beforeIntecerptors в контроллерах Grails это работает.

class MyFilters {
    def filters = {
        before = {
            render(view: "/test", status:200)
            return false
        }
    }
}
0 голосов
/ 27 марта 2012

Мне кажется, что ваше приложение работает правильно. Он показывает 404, потому что / views / test.gsp не существует. Когда я изменяю код на следующий, он работает для меня.

class MyFilters {
    def filters = {
        StackOverflowTestFilter (controller:'*') {
            before = {
                render("Hello World!")
                // also fine: render(controller:"mycontroller", action:"myaction")
                return false
            }
        }
    }
}

Кроме того, знаете ли вы, что возвращение false всегда отменяет остальную часть потока? Возвращайте false , только если фильтр замечает какое-то нарушение того, что вы хотите отфильтровать.

Надеюсь, это поможет!

...