Spring Контроллеры: Можно ли вызвать метод перед вызовом каждого метода @RequestMapping?

У меня есть некоторые общие компоненты, которые всегда присутствуют на каждой странице, обслуживаемой заданным классом контроллера.

В начале каждого метода @RequestMapping я заполняю модель этими общими компонентами.

Есть ли способ определить метод, который должен быть вызван до каждого из методов контроллера, чтобы я мог получить всю эту копию/пасту в одном месте?

Ответ 1

Просто комментируйте метод с помощью @ModelAttribute

Ниже будет добавлен экземпляр Foo в модель под названием "foo"

@ModelAttribute("foo")
public Foo foo() {
    return new Foo();
}

См. документацию @ModelAttribute

Ответ 2

Перехватчик - это решение. Он имеет методы preHandler и postHandler, которые будут вызываться до и после каждого запроса соответственно. Вы можете подключиться к каждому объекту HTTPServletRequest, а также пропустить несколько, выкапывая его.

Вот пример кода:

@Component
public class AuthCodeInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {

        // set few parameters to handle ajax request from different host
        response.addHeader("Access-Control-Allow-Origin", "*");
        response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
        response.addHeader("Access-Control-Max-Age", "1000");
        response.addHeader("Access-Control-Allow-Headers", "Content-Type");
        response.addHeader("Cache-Control", "private");

        String reqUri = request.getRequestURI();
        String serviceName = reqUri.substring(reqUri.lastIndexOf("/") + 1,
                reqUri.length());
                if (serviceName.equals("SOMETHING")) {

                }
        return super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {

        super.postHandle(request, response, handler, modelAndView);
    }
}

Ответ 3

Все методы, имеющие аннотацию @ModelAttribute, вызывается перед конкретным обработчиком, а возвращаемые значения добавляются в экземпляр модели. Затем вы можете использовать эти атрибуты в своих представлениях и в качестве параметров обработчика.

Я нашел этот блог очень полезен.

Ответ 4

Да, вы можете использовать interceptor. Вы можете определить их <mvc:interceptors>

Другой вариант - использовать s Filter, но вы не сможете вставить spring beans в него.