zoukankan      html  css  js  c++  java
  • 如何在Java的Filter中注入Service???

    今天在做用户使用cookie自动登录的时候,发现在LoginFilter中读取到cookie以后要进行查询数据库然后进行用户名和密码的比对,查询数据库肯定要用到Service和Dao,一开始我以为在service属性上直接使用注解就能搞定,没想到啊,还是报了空指针异常。类似下面这样(这样是注入不进来的)

    @Autowired
    private UserService userService;
    

    先给大家说说为什么在Filter中注入不进来service

    我建立一个全局拦截器,当然,我把它命名为LoginFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet,而因为项目应用了spring mvc,所以我们会有一个配置文件(applixationContext.xml),我们在配置spring时会用到spring的listener,它会读取application.xml里的配置对spring context进行初始化;项目启动时,先初始化listener,因此配置在applicationContext.xml里的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。

    遇到一个问题,我们要知其然,并且知其所以然,知道原因以后下面就是解决了!

    今天就来教大家怎么在Java的Filter中注入Service

    1、在我们的LoginFilter中加入需要注入的属性

    /**
    * userService属性
    */
    private UserService userService;
    

    2、在LoginFilter的init()方法中获取 ServletContext

    ①这里有三种方式获取ServletContext

    1)在javax.servlet.Filter中直接获取 

    ServletContext context = config.getServletContext(); 

    2)在HttpServlet中直接获取 

    this.getServletContext() 

    3)在其他方法中,通过HttpServletRequest获得 

    request.getSession().getServletContext();

    3、然后在LoginFilter中获取我们的WebApplicationContext上下文

    WebApplicationContext cxt =WebApplicationContextUtils.getWebApplicationContext(sc);
    

    从下面spring源码的可以看到WebApplicationContextUtils.getWebApplicationContext(sc)需要传入一个ServletContext对象(就是我们上面获取的)我们把sc放进去

    public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
    return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
    }
    

    4、从WebApplicationContext上下文中获取bean,赋值给我们的userService

    userService = (UserService) cxt.getBean(UserService.class);

    这样就完成注入了 ,是不是很方便呢!

    下面小编把部分源码放上面,方便大家参考:

    public class LoginFilter implements Filter {

    protected static final Logger logger = Logger.getLogger(LoginFilter .class);

    private FilterConfig config;

    /**

    ​* userService属性(作者的企鹅群:162582394密码1欢迎进群交流学习)

    */

    private UserService userService;

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

    config = filterConfig;

    /**

    * 注入service  用户查询数据库

    */

    ServletContext sc = filterConfig.getServletContext();

    WebApplicationContext cxt =WebApplicationContextUtils.getWebApplicationContext(sc);

    if(cxt != null && cxt.getBean(UserService.class) != null && userService == null){

    userService = (UserService) cxt.getBean(UserService.class);

    }

    } } }

    然后我们就可以调用userService中的方法了:

    JSONObject data =userService.userLogin(userName,passWord);
  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/shizhijie/p/8422410.html
Copyright © 2011-2022 走看看