记录一下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);
}
}
这些是我目前所知的方式,欢迎大家一起交流