首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >已经在ShiroWebModule中配置了org.apache.shiro.web.filter.authc.LogoutFilter

已经在ShiroWebModule中配置了org.apache.shiro.web.filter.authc.LogoutFilter
EN

Stack Overflow用户
提问于 2021-03-25 14:48:40
回答 1查看 67关注 0票数 0

我使用的是Shiro 1.7.1和Guice 4.2.3,下面是我的POM文件的片段。

代码语言:javascript
复制
  <properties>
    <shiro.version>1.7.1</shiro.version>
    <guice.version>4.2.3</guice.version>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-web</artifactId>
      <version>${shiro.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-guice</artifactId>
      <version>${shiro.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>${shiro.version}</version>
    </dependency>
    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>${guice.version}</version>
    </dependency>
    <dependency>
      <groupId>com.google.inject.extensions</groupId>
      <artifactId>guice-servlet</artifactId>
      <version>${guice.version}</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    ...
  </dependencies>

我正在通过创建一个新的类来定制Shiro的LogoutFilter,

代码语言:javascript
复制
package com.myshiro.myshiro;


import org.apache.shiro.web.filter.authc.LogoutFilter;

public class MyLogoutFilter extends LogoutFilter {
}

并将上述定制的MyLogoutFilter绑定org.apache.shiro.web.filter.authc.LogoutFilter

代码语言:javascript
复制
package com.myshiro.myshiro;

public class MyShiroModule extends ShiroWebModule {

    public MyShiroModule(ServletContext servletContext) {
        super(servletContext);
    }

    protected void configureShiroWeb() {
        try {
            bindRealm().toConstructor(IniRealm.class.getConstructor(Ini.class));
        } catch (NoSuchMethodException e) {
            addError(e);
        }
        bind(org.apache.shiro.web.filter.authc.LogoutFilter.class).to(MyLogoutFilter.class).in(Scopes.SINGLETON);
        addFilterChain("/logout", LOGOUT);
    }
}

我尝试在单元测试类中创建Guice注入器,如下所示,

代码语言:javascript
复制
public class MyShiroModuleTest {

    @Mock
    private ServletContext servletContext;

    @Test
    public void test() {
        Guice.createInjector(new MyShiroModule(servletContext));
    }
}

它失败了,错误如下:

代码语言:javascript
复制
1) Binding to null instances is not allowed. Use toProvider(Providers.of(null)) if this is your intended behaviour.
  at org.apache.shiro.guice.web.ShiroWebModule.configureShiro(ShiroWebModule.java:136)

2) A binding to org.apache.shiro.web.filter.authc.LogoutFilter was already configured at com.myshiro.myshiro.MyShiroModule.configureShiroWeb(MyShiroModule.java:25).
  at org.apache.shiro.guice.web.ShiroWebModule.setupFilterChainConfigs(ShiroWebModule.java:209)

从上面的第二个注释中,它解释了到org.apache.shiro.web.filter.authc.LogoutFilter的绑定已经在MyShiroModule和ShiroWebModule中进行了配置。你知道如何绑定到我定制的LogoutFilter吗?

这个问题在Shiro 1.3.x中没有发生。

我的示例项目是可用的here,当您mvn clean install时,您可以简单地看到错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-29 08:51:55

听起来你的问题是和Guice 4有关的,而不是Shiro。不是重用相同的绑定键,而是定义一个新的绑定键,如下所示:

代码语言:javascript
复制
bind(MyLogoutFilter.class).to(MyLogoutFilter.class).in(Scopes.SINGLETON);
addFilterChain("/logout", Key.get(MyLogoutFilter.class));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66794417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档