2

我在我的 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 转储。

但是,这对我来说似乎有点安全漏洞。我的一些操作是 API 样式的操作,并且在 HTML、JSON 或 XML 中合法可用。但是,某些视图仅适用于 HTML。我真的不希望最终用户能够通过将“.json”添加到 url 来查看所有视图数据。

有没有办法在 Spring MVC 中进行内容协商,但仅限于明确选择加入的操作?我可以设置一个控制器注释@RespondsTo("xml", "json")吗?

4

3 回答 3

1

为什么不通过 DelegatingFilterProxy 使用过滤器来阻止用户访问不必要的内容类型?

于 2012-01-06T18:55:19.710 回答
1

我刚刚面临同样的问题。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 错误

于 2013-11-19T21:09:56.777 回答
0

一种方法是使用 Spring Security 根据内容类型(或您用于内容协商的任何其他方法)来限制可以看到哪些页面。

于 2012-01-06T18:12:43.337 回答