在没有ServletContext的情况下使用Guice配置Shiro

时间:2012-11-30 09:35:18

标签: java apache jetty guice shiro

我正在使用 Guice 连接 Jetty 服务器,我希望通过 Apache Shiro 添加一些安全性。

似乎Shiro需要配置一个 ServletContext ,但问题是我没有在配置时有一个ServletContext(例如在 ServletModule 中作为文件说明)。 ServiceContext GuiceServletContextListener 中可用,但此时我的注入器已经创建,因此安装 Shiro 模块要迟到。

我尝试通过 Guice 提供程序( Provider< ServletContext> )向 Shiro 提供 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 个答案:

答案 0 :(得分:2)

获取ServletContext的标准方法是扩展GuiceServletContextListener

Imho是对API的主要监督。

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

这里还有一个教程:

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

(编辑:阅读评论后) 您有两个选择:

  1. 将代码重构为仅在GuiceServletContextListener
  2. 中创建注入器
  3. 使用儿童注射器(棘手)
  4. 对于Child Injector,只有子注入器创建的实例才会获得“Shiroed”。请记住:尽可能在祖先注射器中创建为子注射器创建的即时绑定。

    对于您的Servlet和过滤器,事情会按预期工作,但如果您已经创建的Injector中有业务逻辑,他们将看不到Shiro。您可以通过几种方式解决此问题......

答案 1 :(得分:2)

有同样的问题并使用@Mircea中的信息,我所做的就是将GuiceServletContextLister转换为ServletContext,换句话说

Guice.createInjector(新的ShiroWebModule((ServletContext)这个);

希望这会有所帮助