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

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

1 голос
/ 06 января 2012

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

1 голос
/ 20 ноября 2013

Я просто столкнулся с той же проблемой. 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-представление /create.json - 406 Ошибка

0 голосов
/ 06 января 2012

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

...