2012-11-30 32 views
3

我使用吉斯連接一個碼頭服務器,我想與阿帕奇四郎增加一些安全性。配置四郎與吉斯沒有一個ServletContext

看來四郎需要 ServletContext的進行配置,但問題是我不; t有在配置時間一個ServletContext(例如在 servlet模塊如文檔狀態)。 ServletContext可用於 GuiceServletContextListener,但此時,我的注射器已經創建,因此要安裝 Shiro模塊的模塊已晚。

我試圖提供 ServletContext的四郎通過吉斯提供商(提供商<的ServletContext >),但仍然沒有成功。我認爲這個提供者將在創建後提供ServletContext。這也給出了一個警告:

"com.google.inject.servlet.InternalServletModule$BackwardsCompatibleServletContextProvider get 
WARNING: You are attempting to use a deprecated API (specifically, attempting to @Inject ServletContext inside an eagerly created singleton. While we allow this for backwards compatibility, be warned that this MAY have unexpected behavior if you have more than one injector (with ServletModule) running in the same JVM." 

在注入器創建後,如何安裝Shiro Web模塊?

回答

2

獲取ServletContext的標準方法是擴展GuiceServletContextListener

Imho是API的一項重大監督。

http://code.google.com/p/google-guice/issues/detail?id=603

還有這裏的教程:

https://issues.apache.org/jira/browse/SHIRO-320

(編輯:閱讀意見後) 你有2種選擇:

  1. Refacture代碼只創建進樣器GuiceServletContextListener
  2. 使用兒童注射器(棘手)

使用兒童注射器只有子注射器創建的實例將獲得「Shiroed」。請記住:儘可能在祖先注射器中創建爲子注射器創建的即時綁定。

事情將按照您的Servlet和過濾器的預期工作,但是如果您在已經創建的注入器中有業務邏輯,他們將不會看到Shiro。您可以在幾種方法解決這個...

+0

在我的情況下,注射器已經被ServletContext中在GuiceServletContextListener初始化時創建的。 – Mircea

+0

在Guice中,WebGuiceEnvironment需要ServletContext。我試圖修改WebGuiceEnvironment並在創建注入器後設置ServletContext,但它似乎也不能像這樣工作。請求被阻止,但是我的域名不會被要求授權(這意味着每次都會阻止) – Mircea

+0

您可以將模塊添加到現有的注入器嗎?你如何創建它? –

2

有同樣的問題,並使用從@Mircea的信息我所做的只是投了GuiceServletContextLister到ServletContext中換句話說

Guice.createInjector(新ShiroWebModule(( ServletContext中)這一點);

希望這有助於