Если логика, которую вы реализуете, является сквозной задачей, которая обычно не связана с конкретными представлениями, я бы предложил использовать перехватчик, а не создавать функциональные иерархии контроллера. Иерархии контроллеров могут затруднить решение таких проблем, как сопоставление исключений и управление / жизненный цикл данных сеанса. Кроме того, на уровне представлений вам, скорее всего, придется со временем менять вещи для изменения требований клиентов, поэтому функциональной иерархии, обеспечивающей будущее, не произойдет.
org.springframework.web.servlet.HandlerInterceptor
имеет метод 'postHandle', который дает вам доступ к запросу, контроллер, обработавший запрос, и ModelMap. Это должно быть все, что вам нужно. Если вам нужен какой-то контроль со стороны контроллера, вы всегда можете добавить к нему метаданные, указывающие, например, какой класс заголовка он использует (затем в будущем, когда вам придется это изменить, это будет одна строка в XML или аннотации, вместо того, чтобы менять класс, от которого вы наследуете, и все, что с этим связано.)
Вы включаете их так:
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="interceptors">
<list>
<bean class="a.package.MyHandlerInterceptor"/>
</list>
</property>
</bean>