Согласование содержимого Spring MVC 3 ограничивается действиями, которые его поддерживают

Я настроил согласование содержимого в приложении 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")?

3 ответа

Я просто столкнулся с той же проблемой. produces атрибут @RequestMapping помогает для этого. Хотя это противоположно тому, о чем вы просили - отказать в отказе, а не в подписке, но я думаю, что это может вас порадовать.

@Controller
@RequestMapping("/categories")
public class CategoriesController
{
    @RequestMapping(value = "/create", method = RequestMethod.GET, produces = "application/xhtml+xml")
    public String createForm(Model model)
    {
    }
}

/create - работает нормально, отображая JSP view/create.json - ошибка 406

Почему вы не используете фильтр через DelegatingFilterProxy, чтобы заблокировать пользователям доступ к ненужным типам контента?

Одним из способов сделать это было бы использование Spring Security для ограничения просмотра страниц на основе типа контента (или любых других методов, которые вы используете для согласования контента).

Другие вопросы по тегам