我有一个Spring mvc(3.1.1)应用程序,我想定义条件超出RequestMapping中可用的条件.我有几件事我想用它.
首先,如果我可以为不同的用户类型显示不同的主页,那将是很好的:
@Controller
public class HomepageController {
@RequestMapping(value = "/")
@CustomCondition(roles = Guest.class)
public String guestHome() { /*...*/ }
@RequestMapping(value = "/")
@CustomCondition(roles = Admin.class)
public String adminHome() { /*...*/ }
}
Run Code Online (Sandbox Code Playgroud)
其次,我希望应用程序既可以作为网站也可以作为REST服务(例如移动应用程序),所以我想让网站访问html和json操作,并让服务(不同的子域)访问json动作(某种@CustomCondition(web = true)只与网站网址匹配)
这可以用于我正在计划的两种用途中的任何一种吗?
我发现很少有关于自定义条件的文档,但我确实找到了一个实现自定义条件的示例,这可能是我想要的,但它使用的是一个@Configuration类,而不是我正在使用的XML配置,我不想移动我的整个spring xml定义到一个@Configuration类.
我可以RequestMappingHandlerMapping在XML中定义customMethodCondition 吗?
我尝试了子类化RequestMappingHandlerMapping和覆盖getCustomMethodCondition,以返回我的自定义RequestCondition,但它没有工作 - getMatchingCondition()在我的条件下没有开火.
任何帮助将不胜感激!
UPDATE
我读了一点,看起来像是RequestMappingHandlerMapping一个新类(从3.1开始).
在我的应用程序中发生的是,尝试覆盖从而重新定义requestMappingHandlerMappingbean 的@Configuration 实际上有效,但是url映射(s中的@RequestMapping方法@Controller)似乎被处理两次,一次由子类处理,一次由ExtendedRequestMappingHandlerMapping原始处理 - 第RequestMappingHandlerMapping一次处理自定义条件,然后再没有它.
底线是我的自定义条件被简单地忽略.
这应该是一种先进的模式,但IMO应该很常见......
评论任何人?
Spring MVC 已经提供了一种区分 json 和 html 的机制,RequestMapping 注释采用一个 Consumer 属性来查看请求的内容类型...
// REST version, Content-type is "application/json"
@RequestMapping(value = "/", consumes = "application/json")
public void myRestService() {
...
// HTML version, Content-type is not "application/json"
@RequestMapping(value = "/", consumes = "!application/json")
public void myHtmlService() {
...
Run Code Online (Sandbox Code Playgroud)
使用相同 url 但具有不同方法的另一种方法是使用 param 或 headers 属性...
// the url is /?role=guest
@RequestMapping(value = "/", param = "role=guest")
public void guestService() {
// the url is / with header role=admin
@RequestMapping(value = "/", headers = "role=admin")
public void adminService() {
Run Code Online (Sandbox Code Playgroud)
我认为您会需要不同的网址以确保安全。通常,使用 Spring Security 之类的东西,您可以将所有管理功能放在 /admin 下,并让框架管理这一切......
<http auto-config="true">
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
...
Run Code Online (Sandbox Code Playgroud)
这足以满足您的用例吗?
| 归档时间: |
|
| 查看次数: |
3250 次 |
| 最近记录: |