您可以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()将调用并使用您想要的任何对象填充您的模型。
您还可以注册一个 servlet Filter(在web.xml或中WebApplicationInitializer)。过滤器只是在分派到 servlet 之前添加请求属性。
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在 Spring 之前调用DispatcherServlet. 此外,Filter它由您的 servlet 容器管理(存在解决方法),因此很难将 Spring bean 注入其中。