使用 Spring 容器管理 Filter
《
使用 Spring 容器管理 Servlet》一文介绍了如何使用 Spring 对 Servlet 进行管理,本文是《
使用 Spring 容器管理 Servlet》的姊妹篇,本文介绍如何使用
Spring 对 Filter 进行管理。其实具体原理方法和前者大同小异。
如一般的 J2EE 配置一样,Spring 在 web.xml 中的配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
如一般的 J2EE 配置一样,Spring 在 applicationContext-service.xml 中定义我们的业务逻辑处理类:
<bean id="logService"
class="com.defonds.cds.system.log.impl.LogServiceImpl"
parent="baseService" scope="singleton" init-method="init" destroy-method="destroy">
</bean>
如同一般的 Struts1/2 的 action 一样在我们的 Filter 中注入 service:
private LogService logService;
public LogService getLogService() {
return logService;
}
public void setLogService(LogService logService) {
this.logService = logService;
}
在 Filter 中如同一般的 Struts1/2 的 action 一样调用 service:
String ip = logService.getIpAddr(request);
如同一般的 Filter 我们的这个 Filter 需要实现 javax.servlet.Filter 接口:
public class BlockedIpFilter implements Filter {
根据自己的业务需要去实现 init、doFilter 和 destroy 方法:
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
if (ifIpBlocked) {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String ip = logService.getIpAddr(request);
if (logService.ifBlocked(ip)) {
response.getWriter().write("error");
response.getWriter().close();
} else {
filterChain.doFilter(request, response);
}
} else {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
新建一个 Filter 代理类,这个类类似于 DelegatingFilterProxy 那样的代理,通过代理根据配置来找到实际的 Filter,完成业务逻辑功能:
package com.defonds.cds.system.log.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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;
//Filter 的代理类。系统所有的 Filter 共用此一个
public class DelegatingFilterProxy implements Filter {
private String targetFilterBean;
private Filter proxy;
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
proxy.doFilter(servletRequest, servletResponse, filterChain);
}
@Override
public void init(FilterConfig config) throws ServletException {
this.targetFilterBean = config.getInitParameter("targetFilterBean");
ServletContext servletContext = null;
servletContext = config.getServletContext();
WebApplicationContext wac = null;
wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.proxy = (Filter) wac.getBean(this.targetFilterBean);
this.proxy.init(config);
}
@Override
public void destroy() {}
}
不同于一般的 Filter 在 web.xml 中的配置,需要配置的是 Filter 代理类,而非 Filter:
<filter>
<filter-name>proxyBlockedIpFilterBean</filter-name>
<filter-class>com.defonds.cds.system.log.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterBean</param-name>
<param-value>blockedIpFilterBean</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>proxyBlockedIpFilterBean</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最后在 applicationContext-service.xml 中将 Filter 及其业务对象的依赖关系配置到 Spring 容器管理:
<bean id="blockedIpFilterBean" class="com.defonds.cds.system.log.filter.BlockedIpFilter">
<property name="logService">
<ref bean="logService"/>
</property>
</bean>
注意这里的 blockedIpFilterBean 要和 web.xml 配置的 blockedIpFilterBean 对应,logService 要和 Filter 中 get/set 得到的 logService bean 对应。
分享到:
相关推荐
使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。 (4) spring-context.jar 这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ...
使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。 (4) spring-context.jar 这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ...
可用于分析spring mvc源码、spring mvc父子容器初始化流程、session和cookie机制、spring session等,也可以用于学习Java Web(servlet、filter、listener等)、spring源码等。 该项目使用servlet3.0规范,无web.xml...
使用Spring 4.0.x和Gradle 24 2.4.3项目模块 25 核心 - spring-security-core.jar 25 远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - ...
web容器中(web.xml)中添加struts2 filter以及spring 监听器。 b 在struts.xml中添加action,使用通配符的方式 , 注意这里和单独struts2不同的地方: class属性指向的是bean 的 id ,这里我们配置bean采用spring ...
19.2. 在Spring Security里使用LDAP 19.3. 配置LDAP服务器 19.3.1. 使用嵌入测试服务器 19.3.2. 使用绑定认证 19.3.3. 读取授权 19.4. 实现类 19.4.1. LdapAuthenticator实现 19.4.1.1. 常用功能 ...
原理过程 Springboot中会使用FilterRegistrationBean来注册Filter,Filter是Servlet规范里面的,属于容器范围,Springboot中没有web.xml,那Springboot中,不用管Filter是如何交给Ser...SpringBoot整合XssFilter,...
18.2. 在Spring Security里使用LDAP 18.3. 配置LDAP服务器 18.3.1. 使用嵌入测试服务器 18.3.2. 使用绑定认证 18.3.3. 读取授权 18.4. 实现类 18.4.1. LdapAuthenticator实现 18.4.1.1. 常用功能 18.4.1.2. ...
19.2. 在Spring Security 里使用LDAP 19.3. 配置LDAP 服务器 19.3.1. 使用嵌入测试服务器 19.3.2. 使用绑定认证 19.3.3. 读取授权 19.4. 实现类 19.4.1. LdapAuthenticator 实现 19.4.1.1. 常用功能 ...
1.6 使用Spring Initializer向导快速创建Spring Boot 16 2 Spring Boot配置 18 2.1 配置文件 18 2.2 YML语法 19 2.3 YML配置文件值获取 21 2.4 properties配置文件乱码问题 24 2.5 @ConfigurationProperties与@Value...
使用一个J2EE管理的事务管理器 iv. 32.4. 混合XA和non-XA的JMS连接 v. 32.5. 支持可替代的内嵌事务管理器 xii. 33. Spring集成 xiii. 34. 基于JMX的监控和管理 xiv. 35. 测试 Spring Boot参考指南 4 i. 35.1. 测试...
3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。 通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。 以上是Spring+...
该Webfilter对Java EE(或其他实现Servlet 3.1 API的Web容器)执行相同的操作。 特征 该Webfilter支持两种响应服务方法(行为)。 响应服务方法 解释 重新定向 对webjars/foo/bar.js将通过返回重定向标头来解决。 ...
使用标准的注解(例如Spring Web控制器和ServletFilter等),使用普通jar添加功能 自动检测并提供嵌入式静态资源 Sprint Boot 将应用程序入口点创建为@SpringBootApplication 自定义Spring Boot启动横幅 将...
Java中核心注解的作用及其使用,了解Spring容器装载的过程和机制,自定义注解来实现自动配置项目依赖环境,包括mybatis、Dubbo、log4j、RabbitMQ、redis相关等自动配置。 springboot 核心注解 主要注解有: @...
springboot内部绑定了嵌入式http servlet容器Jetty,主体框架基于spring,而spring除了Ioc(依赖注入)、Aop(切面)外,其它与http相关的东西都是基于Servlet和Filter的,而Servlet、Filter是servlet容器Jetty按照...
* cn.itcast.crm.container:重新封装spring容器 * cn.itcast.crm.dao:放置的是dao接口 * cn.itcast.crm.dao.impl:放置的是dao接口的实现类 * cn.itcast.crm.domain:放置的是po类、po类和数据库表关联的映射文件 ...
这张图上展示了一个基于SSH,B/S结构的单体Java应用的搭建过程,首先通过浏览器进入到Filter拦截器,进入到Structs2,通过Service层进入到Hibernate,从而进行数据库,经过而这整个过程都是由SpringIOC容器控制。...
实际使用shiro的时候大部分都是和spring等框架结合使用,主要就是配置web.xml将shiro的filter和spring容器bean的filter关联起来,生命周期由servlet容器来控制,然后配置shiro的spring的xml文件,其中主要配置shiro...
弹簧过滤器 [MVC生命周期](#MVC生命周期) [如何使用过滤器](#如何使用... 因为它是一个Spring容器,所以它可以注入其他bean并具有良好的可用性。 因为可以使用其他bean,所以将实现证书,授权等。 如何使用过滤