0

目前有一個我正在使用的Web應用程序,它必須擴展以公開Web服務。在當前項目中 - 在啓動時加載應用程序上下文時 - 進行數據庫查詢,並將靜態數據(如角色名稱)設置爲會話級別的變量。 像這樣:如何在Spring Web應用程序中將數據從Session的屬性移動到應用程序上下文?

private void loadRoles(ServletContext acontext) { 
    ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(acontext); 
    IMyDataService myDataService = (IMyDataService) appContext.getBean("myDataService"); 
    List<Roles> rolesList = myDataService.listRoles(); 
    acontext.setAttribute(MyAppConstants.ROLES, rolesList); 
} 

存儲在會話屬性此值用作應用程序的其他地方如下:

public boolean checkAccess(HttpServletRequest arequest) { 
    HttpSession session = arequest.getSession(); 
    List<Role> roles = (List<Roles>)session.getServletContext().getAttribute(MyAppConstants.ROLES); 
    ..... 
} 

如果我要增強應用程序公開Web服務 - 我的理解是我將不再擁有可用的ServletSession或HttpServletRequest。所以我想把這個靜態數據從會話變量移到另一個地方,以便它們在上下文中可用。

有沒有一種方法可以實現這個目標? 我試圖擺脫存儲會話變量中的數據一起,但不能這樣做,因爲只有太多的引用。 有沒有更好的方法?

+0

在您的例子中,數據在應用範圍(appContext)店,而不是在會話範圍。這有點令人困惑...... –

+0

@ Jean-PhilippeBond - 我編輯了添加方法簽名的代碼。添加角色列表的「acontext」是一個ServletContext。在使用此列表的應用程序中的其他位置,將從應用程序上下文中獲取會話,然後使用該值。 – user811433

+0

編輯該問題的進一步細節 – user811433

回答

2

會話和servlet上下文有區別。我認爲你很混淆,因爲你使用會話對象來獲取servlet上下文。在本例中,您的數據清楚地在servlet上下文中設置。即使您正在使用Web服務,您也將擁有由servlet容器提供的servlet上下文。

現在我不知道您正在使用哪種技術,但還有很多其他方法可以將靜態數據提供給所有Web服務。例如,使用一個緩存機制可能是存儲在數據庫中的數據更好的解決方案...

More info :

Servlet會話是從Servlet上下文一個非常不同的事情。

HttpSession是一種機制,用於模擬和維護主要由Servlet容器管理的Web瀏覽器和Web應用程序之間的連續用戶會話, 。 HTTP協議是無狀態的,它本質上是一個請求 - 響應方案,因此Servlet通過爲每個 請求傳遞一個唯一的HTTP cookie值,或者通過在Servlet URL中動態地包含一個標識符, (稱爲URL重寫) 。

一個ServletContext對象表示 Servlet容器的整體配置,有幾種方法來獲取配置參數 ,除Servlet的,把請求轉發和負載 資源交換數據。 Servlet上下文通常通過 的ServletConfig對象間接獲得,傳遞給Servlet的init(ServletConfig) 方法,或者從Servlet的getServletConfig()方法中獲取。爲ServletContext

的Javadoc定義:

定義了一套方法,一個servlet使用其 servlet容器通信,例如,以獲取MIME類型的文件, 調度請求,或寫入日誌文件。

有每Java虛擬機「Web應用程序」一個上下文。 (A「Web應用程序」是servlet和內容的集合,安裝在服務器的URL命名空間的特定子集下 如通過.war文件安裝/目錄 和可能。)

編輯

要獲得在Spring應用ServletContext對象,請使用@Autowired註解。請注意,該對象應該由Spring容器管理,如果您使用的是控制器REST服務,則會出現這種情況。

@Autowired 
ServletContext servletContext; 

下面的例子:

@Controller 
@RequestMapping("/foo") 
public class RESTController { 

    @Autowired 
    ServletContext servletContext; 

    @ResponseBody 
    @RequestMapping(value="/bar", method = RequestMethod.GET) 
    public List<Roles> getRoles() { 
     return servletContext.getAttribute(MyAppConstants.ROLES); 
    } 
} 
+0

感謝您的信息。我有一個問題,但。有些地方實際上正在使用角色列表 - 就像上面的checkAccess()方法一樣。這些方法當前正在從JSP中調用,因此HttpSession從HttpServletRequest中檢索。然後session.getServletContext()給出ServletContext。在Web服務的情況下 - 我不會有HttpServletRequest和這樣反過來就不必HttpSession中得到ServletContext中。所以存儲在ServletContext中的值將會丟失給我。有沒有一種方法可以讓他們脫離應用程序環境? – user811433

+0

您計劃將哪個框架用於Web服務? –

+0

試圖用Spring MVC構建REST風格的Web服務。當前的Web應用程序是基於spring + hibernate的。因此,在一些路徑後,Spring MVC看起來最合適 – user811433

0

通過刪除MyAppConstants.ROLES並依靠Spring DI重構代碼。存儲靜態數據比將它們放在HTTP會話或servlet上下文中要好得多...(例如,創建一個列表bean,使用緩存抽象,使用FactoryBean等)。

相關問題