Я настроил согласование содержимого в приложении Spring MVC 3 следующим образом:
<bean
class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="order" value="0" />
<property name="favorPathExtension" value="true" />
<property name="defaultContentType">
<ref bean="htmlMediaType" />
</property>
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</map>
</property>
<property name="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
<bean class="org.springframework.web.servlet.view.xml.MarshallingView">
<property name="marshaller">
<bean class="org.springframework.oxm.castor.CastorMarshaller" />
</property>
</bean>
</list>
</property>
<property name="viewResolvers">
<ref bean="tilesViewResolver" />
</property>
</bean>
Это работает очень хорошо - все мои представления будут отображаться как представления html с «обычными» шаблонами представления или как JSON или XML-дамп данных модели представления в зависимости от заголовка «Accept».
Однако, мне кажется, это немного дыра в безопасности. Некоторые из моих действий - это действия в стиле API, и они законно доступны в HTML, JSON или XML. Однако некоторые представления предназначены только для HTML. Я не хочу, чтобы конечные пользователи могли видеть все данные представления, просто добавив «.json» в URL.
Есть ли способ выполнить согласование содержимого в Spring MVC, но только для действий, которые явно включили его? Могу ли я настроить аннотацию контроллера как @RespondsTo("xml", "json")
?