如何使用Spring管理Filter和Servlet
在使用spring容器的web应用中,业务对象间的依赖关系都可以用context.xml文件来配置,并且由spring容器来负责依赖对象 的创建。如果要在filter或者servlet中使用spring容器管理业务对象,通常需要使用WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext())来获得WebApplicationContext,然后调用WebApplicationContext.getBean(“beanName”)来获得对象的引用,这实际上是使用了依赖查找来获得对象,并且在filter或者servlet代码中硬编码了应用对象的bean名字。为了能在filter或者servlet中感知spring中bean,可采用如下步骤来实现:
1、将filter或者servlet作为bean定义在context.xml文件中,和要应用的bean定义放在一起;2、实现一个filter代理或者servlet代理,该代理用WebApplicationContext来获得在context.xml中定义的filter或者servlet的对象,并将任务委托给context.xml中定义的filter或者servlet3、在web.xml中用ContextLoaderListener来初始化spring 的context,同时在filter代理或者servlet代理的定义中用初始化参数来定义context.xml中filter或者servlet的bean名字(或者直接受用代理的名称获得相应的filter或者servlet的名称)。4、在web.xml中定义filter代理或者servlet代理的mapping。利用这种方式就将filter或者servlet和业务对象的依赖关系用spring 来进行管理,并且不用在servlet中硬编码要引用的对象名字。具体实例如下:
1、spring与web配置
1.1 在applicationContext.xml中定义filter
<bean id="springFilter" class="com.sirui.filter.SpringFilter"> <property name="name"> <value>SpringFilter</value> </property> </bean>说明:com.sirui.filter.SpringFilter为实现了javax.servlet.Filter接口的filter实现filter代理 实际上,filter代理不需要我们自己来实现,Spring提供了两种现成的filter代理 org.springframework.security.util.FilterToBeanProxy, org.springframework.web.filter.DelegatingFilterProxy,两者只是在web.xml中的配置上略有不同,下面就让我们一起看看如何在web.xml中进行配置。
1.2. 配置web.xml
初始化spring的context ,因为是使用spring来管理,所以在使用filter前先要初始化spring的context,一般来说配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value> /WEB-INF/applicationContext.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
2、Filter配置:
2.1 FilterToBeanProxy
<filter>
<filter-name> springFilter </filter-name> <filter-class>org.springframework.security.util.FilterToBeanProxy </filter-class> <init-param> <param-name>targetBean</param-name> <param-value>springFilter</param-value> </init-param>
</filter>
说明:需要为FilterToBeanProxy提供上下文参数,这里我们配置的是targetBean属性,它告诉spring在context中查找的bean名称,所以当请求被过滤器拦截后FilterToBeanProxy会在applicationContext.xml中会查找id为springFilter的bean.我们也可以配置targetClass属性,意思就是查找该类型的bean.
2.2 DelegatingFilterProxy
<filter>
<filter-name>springFilter</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class>
</filter>
说明:使用DelegatingFilterProxy时不需要配置任何参数,spring会根据filter-name的名字来查找bean,所以这里spring会查找id为springFilter的bean.
2.3 配置filter的mapping
<filter-mapping>
<filter-name>springFilter</filter-name> <url-pattern>/*</url-pattern>
</filter-mapping>
filter配置完成。推荐使用DelegatingFilterProxy,应为配置上更简单。
3、Servlet 配置
Servlet的配置与Filter的配置十分相似
3.1 在applicationContext.xml中定义servlet
<bean id="springServlet" class="com.sirui.servlet.SpringServlet"> <property name="name"> <value>SpringServlet</value> </property> </bean>
说明:com.sirui.servlet.SpringServlet继承自 javax.servlet.http.HttpServlet
3.2 实现servlet代理,与filter不同,spring没有为servlet提供代理实现,需要我们自己来创建,不过放心,创建一个servlet代理十分简单,一个具体的实现如下:
package com.sirui.servlet;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class ServletToBeanProxy extends GenericServlet {
private String targetBean;
private Servlet proxy;
public void init() throws ServletException { this.targetBean = getInitParameter("targetBean"); getServletBean(); proxy.init(getServletConfig());
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException { proxy.service(req, res);
}
private void getServletBean() { WebApplicationContext wac = WebApplicationContextUtils .getRequiredWebApplicationContext(getServletContext()); this.proxy = (Servlet) wac.getBean(targetBean);
}
}
说明:相信看了代码就明白了,它利用targetBean属性在spring中查找相应的servlet,这很像FilterToBeanProxy的方式,所以我为其取名为ServletToBeanProxy。当然,我们也可以使用类似于DelegatingFilterProxy的方式,只需要将上述代码中标记为黄色的部分修改为this.targetBean=this.getServletName();即可,我们相应的命名为DelegatingServletProxy。
配置web.xml和初始化spring的context 与filter中的说明一致,不再赘述。
3.3 ServletToBeanProxy
<servlet>
<servlet-name>springServlet</servlet-name> <servlet-class> com.sirui.servlet.proxy.ServletToBeanProxy </servlet-class> <init-param> <param-name>targetBean</param-name> <param-value>springServlet</param-value> </init-param> <load-on-startup>1</load-on-startup>
</servlet>
3.4DelegatingServletProxy
<servlet>
<servlet-name>springServlet</servlet-name> <servlet-class> com.sirui.servlet.proxy.DelegatingServletProxy </servlet-class> <load-on-startup>1</load-on-startup>
</servlet>
3.5 配置servlet的mapping
<filter-mapping>
<filter-name>springServlet</filter-name> <url-pattern>/servlet/*</url-pattern>
</filter-mapping>
servlet的配置完成。推荐使用DelegatingServletProxy,应为配置上更简单。
更多技术分享尽在java乐园
如何使用Spring管理Filter和Servlet相关推荐
- spring过滤器Filter 、 拦截器Interceptor 、 切片Aspect 详解
springboot 过滤器Filter vs 拦截器Interceptor vs 切片Aspect 详解 1 前言 最近接触到了过滤器和拦截器,网上查了查资料,这里记录一下,这篇文章就来仔细剖析下过 ...
- 【spring boot2】第8篇:spring boot 中的 servlet 容器及如何使用war包部署
嵌入式 servlet 容器 在 spring boot 之前的web开发,我们都是把我们的应用部署到 Tomcat 等servelt容器,这些容器一般都会在我们的应用服务器上安装好环境,但是 spr ...
- spring boot filter配置方式
spring boot 加载外部filter方式 spring boot filter两种配置方式 1.自定义filter配置 2.加载外部jar包配置 spring boot filter两种配置方 ...
- 170630、springboot编程之普通类中调用spring管理的bean对象
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用 ...
- 在普通java类里获取Spring管理的bean
转自:http://blog.csdn.net/a9529lty/article/details/42145545 如何取得Spring管理的bean (请用第3种方法): 1.servlet方式加 ...
- 【spring】在servlet中注入spring的bean,servlet容器和spring容器
一.Servlet容器 Servlet的整个生命周期好象都是由Servlet容器来处理的. 如果把它硬放到Spring容器中去创建,Servlet对象是可被Spring容器建出来,但Servlet容器 ...
- spring学习之将类交给spring管理,bean的注入,scope,集合注入,自动装配,生命周期,迟加载
一.将类交给spring管理(IOC) 1.将类交给spring容器管理 如何将一个类交给spring容器进行管理呢? 方法很简单,只需要在applicationContext.xml中加入对应的xm ...
- Spring Boot Filter过滤器 实现登录
Spring Boot Filter过滤器 实现登录 Filter类 package com.citi.test;import java.io.IOException;import javax.ser ...
- spring security filter获取请求的urlpattern
序 本文主要讲一下如何在spring security filter里头获取请求的HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE BEST_MATCHIN ...
最新文章
- UVALive 4216 	 Pole Position
- MyBatis子查询
- 接下来学习计划2020.11.9
- css内容渐入效果实现
- The content of element type configuration must match (properties?,settings?,typeAliases?,typeHand...
- SAP License:ERP厂商比较
- 使用过滤器实现网站访问计数器的功能
- 解决win2003默认不能使用移动硬盘的问题
- CSS3弹性盒模型flexbox布局基础版
- edius隐藏快捷键_EDIUS快捷键集锦
- Android虚拟机上安装apk软件指南
- 百度地图地图API(常用)
- 苹果开发证书导出P12的问题
- 常用的字符串方法大全
- python unit test什么意思_Pycharm上python和unittest两种姿势傻傻分不清楚
- mes系统和plc通讯案例_MES与PLC实时通信系统研究
- 商城项目15_采购需求、合并采购单、领取采购单、完成采购、仓库流程图
- 低版本360浏览器下,PDF.js部分文字显示不全的问题
- avro-java,proto-java
- git撤回上一次的提交
热门文章
- java 大整数编程_Java编程--RSA算法中的大整数运算
- 大湾区菜篮子基地 谋定·农业大健康-林裕豪:从玉农业再次入选
- CentOS7安装MySQL并设置远程登录
- 如何快速下载maven依赖jar包
- Java多线程使用场景
- 动态创建的 CEdit 被限制长度,增加 ES_AUTOHSCROLL 属性;被无法Tab激活焦点,增加 WS_TABSTOP 属性(转)...
- Hibernate中启用日志
- 小心as陷阱(c#)
- 研究阿里钉钉近三年,我们总结了10大企业级产品的营销套路
- 一名优秀的初创企业员工怎么做好工作计划