2011-04-27 50 views
6

我需要從Tomcat中的servlet(或過濾器)訪問管理器以通過自定義會話ID加載自定義會話。Tomcat:如何從servlet訪問(會話)管理器

回答你的下一個問題:爲什麼我需要它。 Flash中存在一箇舊的錯誤,它導致它從IE發送cookie而不是從當前瀏覽器發送cookie。所以,如果我在FF中,而且我試圖用SWFUpload上傳文件,那麼最終會出現錯誤的會話和錯誤。

我想將魔術參數添加到POST,應該覆蓋默認(錯誤)會話ID,然後加載自定義會話,而不是Tomcat加載的會話。我不能使用URL重寫,因爲首先解決了Cookie問題,並且當Flash從IE發送錯誤的Cookie時,Tomcat不會嘗試從url重寫的地址加載會話。

我很感激任何其他提示如何從上下文訪問管理器或原始問題的解決方案。

由於提前, Juriy

回答

4

應當通過的ServletContext實施訪問。獲取tomcat的來源來檢查,或使用反射來獲取上下文的所有字段。您可能需要使用大量的反思才能找到經理。

(我找不到經理是否在JNDI暴露出來,但你可以看看有作爲)

5

爲Tomcat:

ApplicationContextFacade appContextFacadeObj = (ApplicationContextFacade) request.getSession().getServletContext(); 

    try 
    { 
     Field applicationContextField = appContextFacadeObj.getClass().getDeclaredField("context"); 
     applicationContextField.setAccessible(true); 
     ApplicationContext appContextObj = (ApplicationContext) applicationContextField.get(appContextFacadeObj); 
     Field standardContextField = appContextObj.getClass().getDeclaredField("context"); 
     standardContextField.setAccessible(true); 
     StandardContext standardContextObj = (StandardContext) standardContextField.get(appContextObj); 
     Manager persistenceManager = standardContextObj.getManager(); 
    } 
    catch(SecurityException e) 
    { 
     logger.error(e); 
    } 
    catch(NoSuchFieldException e) 
    { 
     logger.error(e); 
    } 
    catch(IllegalArgumentException e) 
    { 
     logger.error(e); 
    } 
    catch(IllegalAccessException e) 
    { 
     logger.error(e); 
    } 
6

與之相對伊霍爾的代碼,這段代碼使用少一點的抽象從HttpSession

private Manager manager(HttpSession session) throws Exception { 

    Field facadeSessionField = StandardSessionFacade.class.getDeclaredField("session"); 
    facadeSessionField.setAccessible(true); 
    StandardSession stdSession = (StandardSession) facadeSessionField.get(session); 

    return stdSession.getManager(); 
} 
+0

這真的救了我的培根,謝謝! – RTF 2016-05-22 20:46:51