Spring boot中filter类不能注入@Autowired变量问题

目录
  • filter类不能注入@Autowired变量
    • 问题描述
    • 解决办法
  • @Component注入@Autowired为空

filter类不能注入@Autowired变量

问题描述

项目中的登录是用了shiro以及filter拦截器。输入正确的账号密码之后却不能正常登录。调试代码发现是filter类中定义的变量userService没有值,为null,该变量采用的方式是@Autowired自动注入。由此我认为shiro配置类还是有点问题。

解决办法

在shiroConfig.java(shiro相关bean的定义类)中加入一个bean用来自动注入filter中的变量

    @Bean
    public FilterRegistrationBean myLoginRegistrationBean() {
        FilterRegistrationBean filterRegistration = new FilterRegistrationBean();
        filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));
        //  该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由ServletContainer管理
        filterRegistration.addInitParameter("targetFilterLifecycle", "true");
        filterRegistration.setAsyncSupported(true);
        filterRegistration.setEnabled(true);
        filterRegistration.setDispatcherTypes(DispatcherType.REQUEST);
     //   filterRegistration.addUrlPatterns("/*");// 可以自己灵活的定义很多,避免一些根本不需要被Shiro处理的请求被包含进来
    //    filterRegistration.setName("MyLoginFilter");
     //   filterRegistration.setOrder(1);
        return filterRegistration;
    }

这里面需要注意的是:

filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter"));

这行代码,里面的shiroFilter表示另一个bean。如果你只有一个filter类,可以直接将shiroFilter替换为你的filter对象,如:

filterRegistration.setFilter(new MyUserFilter());

更正:

上面那行单独给filter注入值的写法不对!,应该是先给这个filter定义一个bean:

 @Bean(name = "myUserFilter")
      public MyUserFilter myUserFilterBean() {
        MyUserFilter bean=new MyUserFilter();
        return new MyUserFilter();
 }

然后:

filterRegistration.setFilter(myUserFilterBean());

因为博主项目中有三个filter类,所以不能用第二种new 对象定义,即时写了三个这种bean,还是只有一个filter中的变量能够被注入!所以只能用new DelegatingFilterProxy(“shiroFilter”)方式,因为shiroFilter中已经有了三个filter的定义。其余的相关bean如下:

    @Bean(name = "formAuthenticationFilter")
      public MyLoginFilter myLoginFilterBean() {
        MyLoginFilter bean=new MyLoginFilter();
        bean.setUsernameParam("username");
        bean.setPasswordParam("password");
        bean.setRememberMeParam("rememberMe");
        bean.setLoginUrl("/admin/login");
        bean.setSuccessUrl("/admin/index.view");
        return bean;
    }
    @Bean(name = "sysUserFilter")
      public SysUserFilter sysUserFilterBean() {
    //  SysUserFilter bean=new SysUserFilter();
        return new SysUserFilter();
    }
    @Bean(name = "myUserFilter")
      public MyUserFilter myUserFilterBean() {
    //  MyUserFilter bean=new MyUserFilter();
        return new MyUserFilter();
    }
    @SuppressWarnings("null")
    @Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
        logger.info("注入Shiro的Web过滤器-->shiroFilter", ShiroFilterFactoryBean.class);
        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
        bean.setSecurityManager(securityManager);
        bean.setLoginUrl("/admin/login");
        Map<String, Filter> filters = bean.getFilters();//获取filters
        filters.put("authc", myLoginFilterBean());     //filters中放入三个filter
        filters.put("sysUser", sysUserFilterBean());
        filters.put("user", myUserFilterBean());
        bean.setFilters(filters);
        LinkedHashMap<String, String> filterChainDefinitionMap=new LinkedHashMap<>();
        filterChainDefinitionMap.put("/admin/login", "authc");
        filterChainDefinitionMap.put("/admin/api/**", "sysUser");
        filterChainDefinitionMap.put("/admin/**", "user");
        bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return bean;
    }

@Component注入@Autowired为空

上面的注入是没问题的,我的问题出在调用的地方:

直接new出来的对象是不在spring容器中的,正确的方式是:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 在zuulFilter中注入bean失败的解决方案

    zuulFilter注入bean失败 一.为什么要用到这个 上周想实现在网关层 zuul 实现用户认证操作,即需要在网关过滤器中调用其他的微服务,按常规做法在 filter 中用 @Autowired 注解一个feign 接口,启动 一直失败,用度娘谷歌查了又查,只找到一些类似[在过滤器中注入bean]失败,但说的都是springMVC 并不是springcloud中的网关层 二.解决方法 查了很久,最终发现问题所在,其实在启动报错就提示很明显了,找不到相关实例,没错feign接口的实现类事实上

  • 在Filter中不能注入bean的问题及解决

    目录 Filter中不能注入bean的问题 Filter中注入bean 无效为null 问题原因 解决办法 Filter中不能注入bean的问题 WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); ApiController apiController = (ApiCo

  • 关于SpringBoot拦截器中Bean无法注入的问题

    问题 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Bean无法注入是在拦截器中无效的问题,一直在查找注解指定的包在哪里配置的,然而却找不到配置,Springboot是用java类的形式加载配置的.在网络的某个角落看到这样的说法: SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! "Applicati

  • Springboot @WebFilter无法注入其他Bean的示例问题

    示例问题代码: @WebFilter(filterName = "authorizeFilter", urlPatterns = {"*.htm", "*.html"}, asyncSupported = true) public class AuthorizeFilter implements Filter { @Autowired private OtherBean otherBean; @Override public void init(

  • spring boot拦截器注入不了java bean的原因

    一.如何实现拦截器 在Spring Boot项目中,拦截器经常被用来做登陆验证,日志记录等操作.拦截器是Spring提供的,所以可以将拦截器注成bean,由IOC容器来管理.实现拦截器的方式很简单,主要由以下两个步骤: 自定义拦截器类实现HandlerInterceptor接口 自定义WebMvc配置类实现WebMvcConfigurer接口,添加自定义拦截器类 简要实现代码如下: 自定义拦截器 LoginInterceptor: public class LoginInterceptor im

  • Spring boot中filter类不能注入@Autowired变量问题

    目录 filter类不能注入@Autowired变量 问题描述 解决办法 @Component注入@Autowired为空 filter类不能注入@Autowired变量 问题描述 项目中的登录是用了shiro以及filter拦截器.输入正确的账号密码之后却不能正常登录.调试代码发现是filter类中定义的变量userService没有值,为null,该变量采用的方式是@Autowired自动注入.由此我认为shiro配置类还是有点问题. 解决办法 在shiroConfig.java(shiro

  • 在Spring Boot中从类路径加载文件的示例

    资源加载器 使用Java,您可以使用当前线程的classLoader并尝试加载文件,但是Spring Framework为您提供了更为优雅的解决方案,例如ResourceLoader. 您只需要自动连接ResourceLoader,然后调用getResource(„somePath")方法即可. 在Spring Boot(WAR)中从资源目录/类路径加载文件的示例 在以下示例中,我们从类路径中加载名为GeoLite2-Country.mmdb的文件作为资源,然后将其作为File对象检索. @Se

  • Spring Boot中单例类实现对象的注入方式

    Spring Boot 单例类实现对象的注入 1.最近接手了一个项目 项目用的是SpringBoot,但其中有个类用的是单例,为了不改变单例,且还需要引入Spring管理的Bean对象 2.对于一个单例类按照平时的注解方式添加 启动时会报空指针异常,因为static类对象是创建对象后,内存中还没有注入Bean信息,且无法初始化Bean实例,这里的解决办法是利用@PostConstruct来对单例类中对象的注入 @Component public class MesssageHandle impl

  • 详解在Spring MVC或Spring Boot中使用Filter打印请求参数问题

    使用Spring MVC或Spring Boot中打印或记录日志一般使用AOP记录Request请求和Response响应参数,在不使用AOP的前提下,如果在Filter中打印日志,在打印或消费请求类型为Content-Type:application/json的请求时,会出现严重的问题. 在Spring体系中,过滤器的定义我们一般采用继承OncePerRequestFilter的方式,当然也可以使用原始的Filter. 错误写法一: 如果不对request和response进行处理,使用伪代码

  • Spring Boot中优雅的获取yml文件工具类

    如何在spring boot中优雅的获取.yml文件工具类呢 代码如下: package com.common.base.utils.base; import com.common.base.generator.ResourceManager; import org.yaml.snakeyaml.Yaml; import java.io.InputStream; import java.util.HashMap; import java.util.Map; /** * yml文件工具类 */ p

  • 详解spring boot中使用JdbcTemplate

    本文将介绍如何将spring boot 与 JdbcTemplate一起工作. Spring对数据库的操作在jdbc上面做了深层次的封装,使用spring的注入功能,可以把DataSource注册到JdbcTemplate之中. JdbcTemplate 是在JDBC API基础上提供了更抽象的封装,并提供了基于方法注解的事务管理能力. 通过使用SpringBoot自动配置功能并代替我们自动配置beans. 数据源配置 在maven中,我们需要增加spring-boot-starter-jdbc

  • Spring Boot 中的Servlet简单使用

    当使用spring-Boot时,嵌入式Servlet容器通过扫描注解的方式注册Servlet.Filter和Servlet规范的所有监听器(如HttpSessionListener监听器). Spring boot 的主 Servlet 为 DispatcherServlet,其默认的url-pattern为"/".也许我们在应用中还需要定义更多的Servlet,该如何使用SpringBoot来完成呢? 在spring boot中添加自己的Servlet有两种方法,代码注册Servle

  • Spring Boot中使用 Spring Security 构建权限系统的示例代码

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. 权限控制是非常常见的功能,在各种后台管理里权限控制更是重中之重.在Spring Boot中使用 Spring Security 构建权限系统是非常轻松和简单的.下面我们就来快速入门 Spring Security .在开始前我们需要一对

  • Spring Boot中使用MongoDB数据库的方法

    MongoDB数据库简介 简介 MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自"humongous",是一种开源的文档数据库──NoSql数据库的一种.NoSql,全称是 Not Only Sql,指的是非关系型的数据库. 特点 MongoDB数据库的特点是高性能.易部署.易使用,存储数据非常方便.主要功能特性有: * 面向集合存储,易存储对象类型的数据. * 模式自由. * 支持动态查询. * 支持完全索引,包含内部对象

  • Spring Boot 中使用cache缓存的方法

    一.什么是缓存 Cache Cache 一词最早来自于CPU设计 当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理:没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存.正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取.这大大节省了CPU直接读取内存的

随机推荐