2017-05-16 64 views
0

我們定義了一個控制器並需要聲明HttpSession對象。我可以自動裝入它或作爲對象傳遞給方法。這兩種選擇之間有什麼區別,哪一種更可取?在控制器中聲明HttpSession對象

選項1個

@Controller 
public class UserController { 

    @Autowired 
    HttpSession session; 
    .. 
    .. 
} 

選項2

@Controller 
public class UserController { 

    @RequestMapping(value="/user", method=RequestMethod.GET) 
    public @ResponseBody User getUser(HttpSession session) { 
    .. 
    .. 
    } 
} 

回答

3

在控制器,你應該使用選項2。

會話從http請求開始,結束直到請求停止,但控制器可用,直到應用程序停止。所以你不應該在控制器中自動裝配HttpSession。

之一的情況下,你可以自動連接HTTP會話這樣的:

@Component 
@Scope(value=WebApplicationContext.SCOPE_SESSION) 
public class CurrentUserHolder{ 

    @Autowired 
    private HttpSession session; 

    public User currentUser() { 
     return this.get(); 
    } 

    @Override 
    public User get() { 
     return (User)session.getAttribute("currentUser"); 
    } 
} 

這樣你就可以得到一個服務當前用戶無法獲取會話:

@Service 
public class UserService{ 
    private @Autowired CurrentUserHolder currentUserHolder; 
    ...... 
} 
0

如果你有您的控制器中需要HttpSession的多個方法,選項1是可取的。否則,您可以使用'選項2'而不是在每種方法中對其進行參數化。