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);
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,由于篇幅和涉及版权等问题,无法提供完整的代码实现。以下是基于springboot+shiro+layui实现qq聊天室功能的代码结构和主要实现思路供参考: 1. 后端代码结构 - controller:控制层,实现用户登录、注册等接口。 - service:服务层,实现用户管理、聊天消息管理等业务逻辑。 - dao:数据访问层,实现对数据库的增删查操作。 - entity:实体类,包括用户信息、聊天消息等。 - config:配置类,实现Shiro安全框架的配置。 - websocket:WebSocket实现,接收消息并广播给在线用户。 2. 前端代码结构 - index.html:聊天室主页面。 - login.html:用户登录页面。 - register.html:用户注册页面。 - layui:Layui框架相关文件。 - js:前端JS代码,实现聊天室界面和逻辑。 3. 主要实现思路 - 用户登录:前端发送用户名和密码到后台,后台进行密码验证并返回登录结果。 - 用户注册:前端发送用户名和密码到后台,后台将用户信息保存到数据库。 - 聊天室界面:前端使用Layui实现聊天室界面,包括聊天消息显示和发送消息等功能。 - 实时通讯:使用WebSocket实现前后端实时通讯功能,后端接收消息并将消息广播给所有在线用户,前端接收消息并显示在聊天室界面。 - 私聊功能:在聊天室界面添加私聊功能,用户可以选择一个在线用户进行私聊,后端接收私聊消息并发送给对应的用户。 - 数据库存储:使用MySQL作为持久化存储,将用户信息、聊天记录等数据保存到数据库。 以上是springboot+shiro+layui实现qq聊天室功能的主要实现思路和代码结构,具体实现过程需要根据实际需求进行调整和进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值