Вы можете зарегистрировать HandlerInterceptor
с DispatcherServlet
. Затем реализовать postHandle()
метод:
public class CustomInterceptor extends HandlerInterceptorAdapter /* which implements HandlerInterceptor */ {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
modelAndView.addObject("myObject", new Object());
// add as many as you wish
}
}
ПРИМЕЧАНИЕ: Объект ModelAndView
может быть null
. Это может произойти, если ваш метод обработчика напрямую записывался в тело ответа, например, с помощью @ResponseBody
.
В зависимости от шаблона url, который вы использовали при регистрации перехватчика, postHandle()
будет вызываться и заполнять вашу модель любыми объектами, которые вы хотите.
Вы также можете зарегистрировать сервлет Filter
(в web.xml
или WebApplicationInitializer
). Фильтр просто добавляет атрибуты запроса перед отправкой на сервлет.
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setAttribute("myObject", new Object());
chain.doFilter(request, response);
}
// ... init and destroy methods
}
ПРИМЕЧАНИЕ: В какой-то момент в течение жизненного цикла запроса, Spring добавляет все атрибуты в model
ваших атрибутов запроса.
Недостаток заключается в том, что вы добавляете атрибуты, независимо от того, работал ли ваш @Controller
, так как Filter
вызывается до весны DispatcherServlet
. Кроме того, Filter
управляется вашим контейнером сервлетов (обходные пути существуют), и поэтому его трудно вводить в него весенние бобы.
Либо сервлет 'Фильтр', либо Spring' HandlerInterceptor'. –
@SotiriosDelimanolis Вы можете указать пример или ссылку на него? – nKognito