springboot+shiro中添加自定义过滤器 中使用@Autowired

记录一下shiro中添加自定义过滤器 错误的方式
一、自定义filter中使用@Component将类注入容器中,shiroConfig中注入自定义filter,再设置拦截,结果设置的拦截不会生效,所有的请求都会经过自定义的filter
二、filter不使用@Component 利用 @Bean将filter加到容器,再设置拦截,结果拦截不会生效,所有请求都不会经过自定义filter
三、使用@Component+@WebFilter进行过滤器拦截,不经过shiroConfig拦截,结果设置的拦截不会生效,所有的请求都会经过自定义的filter
总结:使用@Configuration 或 @Component 都能将filter注入到容器,进行拦截,但是拦截所有的请求

@Component
//@WebFilter(filterName = "externalFilter" ,urlPatterns = "/external/*")
public class ExternalFilter implements Filter {
	
	@Autowired
	UserMapper userMapper;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("注入成功");
    }

    @Override
    public void destroy() {}
}

@Configuration
public class ShiroConfig {		

	@Autowired
	ExternalFilter externalFiler;

    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();

        // 设置拦截器
        Map<String, Filter> filterMap = new LinkedHashMap<>();
        //设置我们自定义的JWT过滤器
        filterMap.put("jwt", new JWTFilter());
        filterMap.put("externalFiler",externalFiler);
       //filterMap.put("externalFiler",getExternalFilter());

        factoryBean.setFilters(filterMap);
        // 必须设置 SecurityManager
        factoryBean.setSecurityManager(securityManager);

        Map<String, String> filterRuleMap = new HashMap<>();

		filterRuleMap.put("/external","externalFiler");
        filterRuleMap.put("/**", "jwt");
		factoryBean.setFilterChainDefinitionMap(filterRuleMap);
        System.out.println("Shiro拦截器工厂类注入成功");
        return factoryBean;
    }
	
	/*@Bean
	public ExternalFilter getExternalFilter(){
		return new ExternalFilter();
	} */
}    

正确的方式
一、利用配置方式将自定义filter注册到FilterRegistrationBean 中

public class ExternalFilter implements Filter {
	
	@Autowired
	UserMapper userMapper;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("注入成功");
    }

    @Override
    public void destroy() {}
}
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean webAuthFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(External());
        registration.setName("ExternalFilter");//设置过滤器名称
        registration.addUrlPatterns("/external/*");//设置注册过滤器的URL格式.
        registration.setOrder(1); //设置优先级 数字越低优先级越高
        return registration;
    }

    @Bean
    public Filter External() {
        return new ExternalFilter();
    }
}

二、上门所说的@WebFilter 要配合 @ServletComponentScan使用

@WebFilter(filterName = "externalFilter", urlPatterns = "/external/*")
public class ExternalFilter implements Filter {
	
	@Autowired
	UserMapper userMapper;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("注入成功");
    }

    @Override
    public void destroy() {}
}

在启动类添加@ServletComponentScan注解

@SpringBootApplication
//指定filter所在的包
@ServletComponentScan(basePackages = "cn.concare.gfm.external") 
public class SpringBootApplication{
	
    public static void main( String[] args )
    {
    	SpringApplication.run(ConcareGFMApp.class, args);
    }
}

这些是我目前所知的方式,欢迎大家一起交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值