我在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")
这样的控制器注释吗?
答案 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根据内容类型(或您用于内容协商的任何其他方法)限制可以查看哪些页面。