Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法

 更新时间:2019年06月21日 08:48:57   作者:NWGDK  
这篇文章主要介绍了Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

在 Spring Boot 中集成 Shiro,并使用 JWT 进行接口认证。

为了统一对 Token 进行过滤,所以自定义了一个 JwtTokenFilter 过滤器。

期间遇到了以下几个问题,这里逐一进行记录,以备日后查阅。

问题一:JwtTokenFilter 无法使用 @Autowired

因为自定义了一个 JWT Token 工具类,用来解析和创建 Token,JwtTokenFilter 中需要用到此工具类,这里本来可以直接手动进行 new 一个新的实例,但由于在 Spring 配置文件中定义了 JWT 签名密钥和过期时间,所以想使用 Spring @ConfigurationProperties 注解进行值得注入,所以这里必须不能手动 new 一个新的实例。

所以在 ShiroConfiguration 配置文件中将 JwtTokenFilter 过滤器交由 Spring 管理:

@Bean
public JwtTokenFilter JwtTokenFilter() {
  return new JwtTokenFilter();
}

启动项目进行测试,JwtTokenFilter 过滤器中 JwtUtil 类成功注入,但又遇到了另外一个问题。

问题二:anon 过滤器失效

在问题一解决后,登录接口一直显示需要认证,所以在只能将 ShiroFilterFactoryBean 中定义的 JwtTokenFilter 又改为原先手动 new:

@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilterFactoryBean() {
  ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  shiroFilterFactoryBean.setSecurityManager(securityManager());
  // 注册自定义过滤器
  Map<String, Filter> filterMap = new LinkedHashMap<>(8);
  // 这里只能使用 new 新建实例
  filterMap.put("authc", new JwtTokenFilter());
  shiroFilterFactoryBean.setFilters(filterMap);
  Map<String, String> filterChains = new LinkedHashMap<>(8);
  filterChains.put("/v1/admin/login", "anon");
  filterChains.put("/**", "authc");
  shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChains);
  return shiroFilterFactoryBean;
}

接着创建一个 Spring 的上下文管理工具类,代码如下:

package com.nwgdk.ums.common.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * Spring 上下文工具类
 *
 * @author nwgdk
 */
@Component
public class SpringContextUtil implements ApplicationContextAware {
  private static ApplicationContext applicationContext;
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    SpringContextUtil.applicationContext = applicationContext;
  }
  /**
   * 获取上下文
   */
  public static ApplicationContext getApplicationContext() {
    return applicationContext;
  }
  /**
   * 通过 bena 名称获取上下文中的 bean
   */
  public static Object getBean(String name) {
    return applicationContext.getBean(name);
  }
  /**
   * 通过类型获取上下文中的bean
   */
  public static Object getBean(Class<?> requiredType) {
    return applicationContext.getBean(requiredType);
  }
}

接着,在 JwtTokenFilter 过滤器中通过以上工具类获取 JwtUtil 工具类:

if (StringUtils.isNotEmpty(jwtToken)) {
  if (jwtUtil == null) {
    jwtUtil = (JwtUtil) SpringContextUtil.getBean("jwtUtil");
  }
}

启动项目进行测试,成功登录。

总结

以上所述是小编给大家介绍的Spring Boot 自定义 Shiro 过滤器无法使用 @Autowired问题及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • @Cacheable 拼接key的操作

    @Cacheable 拼接key的操作

    这篇文章主要介绍了@Cacheable 拼接key的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 深入浅析HashMap key和value能否为null

    深入浅析HashMap key和value能否为null

    HashMap的key和value可为null,线程不安全,HashTable的key和value均不可为null,线程安全,ConcurrentHashMap在多线程场景下使用,key和value也不能为null,还对它们进行了测试和底层代码分析,本文介绍HashMap key和value能否为null,感兴趣的朋友跟随小编一起看看吧
    2025-04-04
  • SpringBoot整合SpringDataJPA的示例

    SpringBoot整合SpringDataJPA的示例

    本文主要介绍了SpringBoot整合SpringDataJPA的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java基于odbc连接oracle的实现方法

    java基于odbc连接oracle的实现方法

    这篇文章主要介绍了java基于odbc连接oracle的实现方法,结合实例形式分析了连接操作的具体步骤与相关实现技巧,需要的朋友可以参考下
    2016-09-09
  • 详解Spring 拦截器流程及多个拦截器的执行顺序

    详解Spring 拦截器流程及多个拦截器的执行顺序

    这篇文章主要介绍了Spring 拦截器流程及多个拦截器的执行顺序的相关资料,帮助大家更好的理解和学习使用Spring框架,感兴趣的朋友可以了解下
    2021-05-05
  • SpringBoot测试类注入Bean失败的原因及分析

    SpringBoot测试类注入Bean失败的原因及分析

    SpringBoot 2.2版本前后测试类有所变化,2.2版本之后使用JUnit 5,导入注解@SpringBootTest和@Test来自junit.jupiter.api包;而2.2版本之前使用JUnit 4,需要额外导入@RunWith注解来自junit.runner包,无论哪个版本,都需确保测试类和启动类的包名一致
    2024-09-09
  • 手把手教你如何在idea中搭建SpringBoot项目

    手把手教你如何在idea中搭建SpringBoot项目

    这篇文章主要介绍了如何搭建一个SpringBoot项目,包括环境准备、创建新项目、探索项目结构以及展望未来,通过详细的步骤和实用的技巧,帮助开发者快速上手SpringBoot开发,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2025-02-02
  • java中TestNG使用教程详解

    java中TestNG使用教程详解

    TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 本文主要介绍了java中TestNG使用教程详解,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • 泛谈Java NIO

    泛谈Java NIO

    java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO),使用它可以提供非阻塞式的高伸缩性网络。下面我们来简单了解一下吧
    2019-05-05
  • Java操作minio删除文件夹及其文件方法(MinIO基本使用)

    Java操作minio删除文件夹及其文件方法(MinIO基本使用)

    MinIO是一个高性能、无限扩展的开源对象存储服务器,它以对象的形式存储数据,并兼容Amazon S3接口,它适用于大规模数据存储、大数据分析、文件共享和备份等应用场景,这篇文章主要介绍了java操作minio删除文件夹及其文件方法,需要的朋友可以参考下
    2024-02-02

最新评论