2011-10-10 57 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