今天在做用户使用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);

最新文章

  1. [转]CryptographyHelper.cs
  2. single-chip microcomputer Microcontroller 单片机 单片微型计算机 微控制器
  3. 使用opencv显示视频的方法
  4. django学习日志之自定义用户扩展
  5. asp.net(c#)网页跳转七种方法小结
  6. Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代
  7. JS 原型链图形详解
  8. win7下的vxworks总结
  9. [Javascript] Advanced Reduce: Additional Reducer Arguments
  10. C#中经常使用的几种读取XML文件的方法
  11. VC图形绘制双缓存的代码复用性讨论
  12. 一、Nginx安装手册
  13. SpringBoot2.0之八 多数据源配置
  14. 「NOI2013」树的计数 解题报告
  15. android开发学习 ------- 关于getSupportFragmentManager()不可用的问题
  16. [物理学与PDEs]第5章第2节 变形的描述, 应变张量 2.2 Cauchy - Green 应变张量
  17. apache24虚拟安装
  18. Spring切面编程实践【原创】
  19. 修复恢复"可疑"的SQLServer数据库
  20. Codeforces Round #503 (by SIS, Div. 2)-C. Elections

热门文章

  1. 转: HTTP Live Streaming直播(iOS直播)技术分析与实现
  2. 云计算之路:AWS, Azure, Aliyun, UCloud提供的Windows操作系统
  3. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何配置虚拟轴 TC3
  4. mac重置蓝牙模块
  5. 字符编码简介:ASCII,Unicode,UTF-8,GB2312
  6. centos mysql iptables配置
  7. mongoDB id 导出,dump,sed,count,mysql import等用法示例
  8. Linux的Samba服务器
  9. 在CentOS 6.3中安装拼音输入法
  10. 单页应用seo收录神器 -- seo-mask