SpringBoot Filter中注入Bean

由于web应用启动的顺序顺序的原因(listener->filter->servlet),在Filter中注入Bean是不会成功的。

网上由很多的实现方式来实现在Filter中注入Bean,这里,我换一种方式,给Filter添加一个构造方法,在初始化Filter的时候把Bean实例传入,这里以Shiro中的拦截remmeberMe的Filter为例:

package com.xibu.config.filter;

import com.xibu.dao.User;
import com.xibu.dao.UserRepository;
import com.xibu.service.UserService;
import com.xibu.utils.Const;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.servlet.OncePerRequestFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;

import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created by archerlj on 2017/7/14.
 */
public class AddPrincipalToSessionFilter extends OncePerRequestFilter {

    private Logger logger = LoggerFactory.getLogger(this.getClass());
    //这里不使用@Autowired注入的方式。
    private UserService userService;

    public AddPrincipalToSessionFilter(UserService userService) {
        this.userService = userService;
    }

    @Override
    protected void doFilterInternal(ServletRequest servletRequest,
                                    ServletResponse servletResponse,
                                    FilterChain filterChain)
            throws ServletException, IOException {

        Subject subject = SecurityUtils.getSubject();
        if (subject.isRemembered()) {
            String nameOrEmail = subject.getPrincipal().toString();
            User user = userService.findByUserNameOrEmail(nameOrEmail, nameOrEmail);
            if (user == null) return;

            Session session = subject.getSession();
            session.setAttribute(Const.LOGIN_SESSION_KEY, user);
            logger.debug("Add principal to session:");
            logger.debug(user.toString());
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }
}

然后,在Shiro的配置文件中初始化AddPrincipalToSessionFilter

package com.xibu.config.shiro;

import com.xibu.config.filter.AddPrincipalToSessionFilter;
import com.xibu.config.filter.KaptchaFilter;
import com.xibu.config.redis.RedisCacheManager;
import com.xibu.config.redis.RedisSessionDAO;
import com.xibu.service.UserService;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import org.apache.shiro.mgt.SecurityManager;

import javax.annotation.Resource;
import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Created by archerlj on 2017/7/9.
 */

@Configuration
public class ShiroConfiguration {

    @Resource
    private UserService userService;

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {

        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        Map<String, Filter> filterMap = shiroFilterFactoryBean.getFilters();
        //记住我过滤器
        filterMap.put("rememberMeFilter", addPrincipalToSessionFilter());

        shiroFilterFactoryBean.setFilters(filterMap);

......
        filterChainDefinitionMap.put("/**", "rememberMeFilter,user");
...
    }


    private AddPrincipalToSessionFilter addPrincipalToSessionFilter() {
        return new AddPrincipalToSessionFilter(userService);
    }
}


最后帮朋友打个小广告

一个有趣的迷你小程序

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,430评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,052评论 6 342
  • 什么是Spring Spring是一个开源的Java EE开发框架。Spring框架的核心功能可以应用在任何Jav...
    jemmm阅读 16,635评论 1 133
  • 近日,网联平台接入培训第三期课程在北京召开,这一期培训主要面向支付机构,此前两期面向的是银行。根据知情人士向中国支...
    i聚合阅读 4,615评论 0 0