2011-10-10 91 views
3

我有一个会话属性:user,并且我有一个url,我希望通过登录用户和公共未被用户登录的用户公开查看。使用相同的请求映射重载弹簧控制器方法

所以我想要做的是这样的:

@Controller("myController") 
@SessionAttributes({"user"}) 
public class MyController { 

@RequestMapping(value = "/MyPage/{id}", method = RequestMethod.GET) 
public ModelAndView getPage(@PathVariable Integer id) { 
    return modelandview1; 
} 

@RequestMapping(value = "/MyPage/{id}", method = RequestMethod.GET) 
public ModelAndView getPage(@PathVariable Integer id, @ModelAttribute User user){ 
    return modelandview2; 
} 

不过,我有一种感觉它不是去工作......建议非常欢迎。

+0

用户如何添加到会话? – jtoberon

回答

1

I don对于@SessionAttributes,我认为这是一个正确的案例。这个注解通常用于保留一个表单支持对象的原始实例,以避免通过隐藏的表单域传递其状态的不相关部分。

你sceanrio是完全不同的,因而这将是更好地使用HttpSession明确:

@RequestMapping(value = "/MyPage/{id}", method = RequestMethod.GET) 
public ModelAndView getPage(@PathVariable Integer id, HttpSession session) { 
    User user = (User) session.getAttribute(...); 
    if (user != null) { 
     ... 
    } else { 
     ... 
    } 
} 

还要注意的是@ModelAttribute是数据绑定的对象 - 用户可以通过传递请求参数改变它的领域。在这种情况下,你绝对不希望它。

+0

谢谢,我不明白这一点“@ModelAttribute是一个数据绑定的主题 - 用户可以通过传递请求参数来改变它的字段” – NimChimpsky

+0

@NimChimpsky:@ @ ModelAttribute'工程与提交表单时的方式相同。因此,恶意用户可以指定额外的HTTP参数来修改'User'对象的字段。 – axtavt

2

您只需要第二种方法,即采用User agument的方法。当调用没有可用的请求属性来填充用户模型时,您将只获得一个全部为null(或全部默认)字段值的User实例,然后在方法体中相应地对待每种情况。

+0

谢谢(分钟字符) – NimChimpsky

+0

不幸的是,导致错误 – NimChimpsky