Spring MVC 3内容协商限制了支持它的操作

时间:2012-01-06 18:08:14

标签: security spring-mvc content-negotiation

我在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”来查看所有视图数据。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我刚遇到同样的问题。 produces的{​​{1}}属性有助于此。虽然它与你所要求的相反 - 选择退出而不是选择加入,但我认为这是可以取悦你的。

@RequestMapping

@Controller @RequestMapping("/categories") public class CategoriesController { @RequestMapping(value = "/create", method = RequestMethod.GET, produces = "application/xhtml+xml") public String createForm(Model model) { } } - 通过显示JSP视图正常工作 /create - 406错误

答案 2 :(得分:0)

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