java-使用相同的请求映射重载spring控制器方法

我有一个session属性: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;
}

但是,我感到它无法正常工作.建议非常欢迎.

最佳答案
我认为@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是数据绑定的主体-用户可以通过传递请求参数来更改其字段.在这种情况下,您绝对不想要它.

转载注明原文:java-使用相同的请求映射重载spring控制器方法 - 代码日志