我正在使用 Guice 连接 Jetty 服务器,并且我想使用 Apache Shiro 添加一些安全性。
似乎 Shiro 需要配置一个 ServletContext,但问题是我在配置时没有 ServletContext(例如,在文档所述的 ServletModule 中)。 ServletContext 在 GuiceServletContextListener 中可用,但此时,我的注入(inject)器已经创建,因此安装 Shiro 模块为时已晚。
我试图通过 Guice 提供者 (Provider) 向 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."
在注入(inject)器创建之后,如何安装 Shiro Web 模块?
最佳答案
获取 ServletContext 的标准方法是扩展 GuiceServletContextListener
。
恕我直言,这是对 API 的重大监督。
http://code.google.com/p/google-guice/issues/detail?id=603
这里还有一个教程:
https://issues.apache.org/jira/browse/SHIRO-320
(编辑:阅读评论后)
您有 2 个选择:
GuiceServletContextListener
对于子注入(inject)器,只有子注入(inject)器创建的实例才会获得“Shiroed”。请记住:为子注入(inject)器创建的即时绑定(bind)将尽可能在祖先注入(inject)器中创建。
对于您的 Servlet 和过滤器,事情将按预期工作,但是如果您在已经创建的注入(inject)器中有业务逻辑,他们将看不到 Shiro。您可以通过几种方式解决此问题...
关于java - 在没有 ServletContext 的情况下使用 Guice 配置 Shiro,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13642422/