如果直接使用 @Autoware 获取 bean 会直接使该 bean 为 null,这是因为这种配置过滤器的方法无法在过滤器中使用 Spring bean,因为 Filter 比 bean 先加载,也就是 Spring 会先加载 Filter 指定的类到 Container 中,这样 Filter 中注入的 Spring bean 就为 null 了。

解决方法:  

  1. 直接在 init() 初始化方法中手动配置 bean。

  (1)开始的声明

 MenuService menuService = null;
ApplicationContext applicationContext = null;

  (2)初始化方法

 @Override
public void init(FilterConfig filterConfig) throws ServletException {
// 手动配置 bean
ServletContext servletContext = filterConfig.getServletContext();
applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
menuService = (MenuService) applicationContext.getBean("menuService");
}

  (3)doFilter() 方法的使用

 menuService.getOwnMenuByUserId(userId.toString(), loginType.toString());

  2. 代理 —— DelegatingFilterProxy 类。

配置过滤器:

 <filter>
<filter-name>permission</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

在 Spring 的配置文件中配置:

 <bean id="permission" class="com.my.myfilter">  

DelegatingFilterProxy 类遵循 filter-name-bean 的原则,会根据 web.xml 中 filter-name 的值查找到 spring 配置文件中 id 与 filter-name 相同的值,然后把接受到的处理信息传递给相对应的类处理。如果想自定义 filter 处理的 bean,可以在 filter 配置中添加下面一段:

 <init-param>
<param-name>targetBeanName</param-name>
<param-value>Spring-bean-name</param-value>
</init-param>

这句话会指定该 filter 使用 Spring-bean-name 去处理该请求。这时候你会发现 Filter.init() 和 Filter.destory() 无法使用 spring bean,这是因为默认 filter 的生命周期是有 tomcat 这类服务器管理的,在配置:

 <init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>

这时候就是由 spring 管理 filter 的生命周期,这样就可以在 init() 和 destory() 使用 spring bean 了。

还有一个重要的事情,有时候你会发现在请求 filter 处理的 url 的时候程序会报错 —— No WebApplicationContext found: no ContextLoaderListener registered?

出现这个的原因是因为:filter 会优于 servlet 先加载到容器里面,如果我们只是在 org.springframework.web.servlet.DispatcherServlet 中配置了 contextConfigLocation,指定了 spring 配置文件位置的话,程序会无法访问 spring bean,解决方法很简单,在 web.xml 配置上:

 <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/conf/web-context.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

这样让 spring bean 第一时间加载到容器里面,这样就不会有 No WebApplicationContext found: no ContextLoaderListener registered? 这个错误了。

以上第一个方法亲测完全可以实现,第二种方法暂未测试,第二种方法来源地址:

http://blog.csdn.net/godha/article/details/13025099

JAVA WEB 过滤器(Filter)中向容器 Spring 注入 bean的更多相关文章

  1. java Web 过滤器Filter详解

    简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...

  2. java web之Filter详解

    java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...

  3. Java Web应用开发中的一些概念

    最近在学习Java Web,发现Java Web的概念很多,而且各个概念之间的关系也挺复杂,本篇博客把这些关系总结于此,主要参考的博客附在文章末尾. 概念 服务器 服务器,硬件角度上说就是一台高性能的 ...

  4. MVC模式在Java Web应用程序中的实例分析

    MVC在软件架构中是一种比较重要的架构思想,已经被广泛的应用在实际的java web项目开发中,我们所要了解和掌握的是mvc的架构思想和使用mvc模式来分析和解决问题的方法.当然相同或不同的项目都有各 ...

  5. 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先

    毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...

  6. Java EE中的容器和注入分析,历史与未来

    Java EE中的容器和注入分析,历史与未来 java中的容器 java中的注入 容器和注入的历史和展望 一.java中的容器 java EE中的注入,使我们定义的对象能够获取对资源和其他依赖项的引用 ...

  7. dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器

    # dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器 #环境centos 7.4 docker 18.03.0-ce # nuxus,创建maven本地源(可 ...

  8. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  9. 【Java Web开发学习】Spring4条件化的bean

    [Java Web开发学习]Spring4条件化的bean 转载:https://www.cnblogs.com/yangchongxing/p/9071960.html Spring4引入了@Con ...

随机推荐

  1. JBoss 系列四十九:JBoss 7/WildFly 中端口使用列表

    JBoss 7中端口使用列表 JBoss 7中所有配置都在一个文件中(standaone*.xml, domain.xml),和之前的JBoss相比JBoss 7用到的端口变少,我们将以表格的形式列出 ...

  2. 利用gotty在web浏览器模拟终端登录

    1.随机url,9000端口访问 gotty -p " -r -w bash -i 2.简单用户名密码授权,9090端口访问 gotty -p -c user:password -w bas ...

  3. FWT学习笔记

    FWT学习笔记 引入 一般的多项式乘法是这样子的: \(c_i=\sum_{i,j}a_j*b_k*[j+k==i]\) 但是如果我们将这个乘法式子里面的+号变换一下变成其他的运算符号呢? \(c_i ...

  4. C# 生成月份及天选择列表,方便做下拉框联动

    月份及天选择列表,很方便做下拉框联动 /// <summary> /// 获取月份选择列表(根据当前语言环境显示月份名称) /// </summary> private IEn ...

  5. Mac 安装mongodb

    http://blog.csdn.net/u010311313/article/details/46948995 1.前往官网下载MongoDB压缩包 2.将下载好的压缩包解压,将解压出的文件夹下的内 ...

  6. 机器学习-Matplotlib绘图(柱状图,曲线图,点图)

    matplotlib 作为机器学习三大剑客之一   ,比热按时无比强大的 matplotlib是绘图库,所以呢我就分享一下简单的绘图方式 #柱状图 #导报 柱状图 import matplotlib. ...

  7. 基于alpine用dockerfile创建的nginx镜像

    1.下载alpine镜像 [root@docker43 ~]# docker pull alpine Using default tag: latest Trying to pull reposito ...

  8. docker启动报错iptables failed: -重建docker0网络恢复

    # docker启动报错 [root@localhost mysqlconf]# docker run -d -p 8080:8080 --link zookeeper:zookeeper -e du ...

  9. Proxy代理模式(结构型模式)

    1.问题 在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失接口透明性的情况下,解决这些麻 ...

  10. maven更换源

    1)在 /etc/maven/settings.xml 找到  <mirrors>  </ mirrors>标签,在标签内部 添加内容如下: <mirror>    ...