`
java-mans
  • 浏览: 11454573 次
文章分类
社区版块
存档分类
最新评论

使用 Spring 容器管理 Filter

 
阅读更多

使用 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 对应。
分享到:
评论

相关推荐

    spring jar 包详解

    使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。 (4) spring-context.jar 这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ...

    Spring 2.5 jar 所有开发包及完整文档及项目开发实例

    使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。 (4) spring-context.jar  这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ...

    spring mvc项目

    可用于分析spring mvc源码、spring mvc父子容器初始化流程、session和cookie机制、spring session等,也可以用于学习Java Web(servlet、filter、listener等)、spring源码等。 该项目使用servlet3.0规范,无web.xml...

    spring security 参考手册中文版

    使用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 - ...

    struts2+spring+hibernate整合示例

    web容器中(web.xml)中添加struts2 filter以及spring 监听器。 b 在struts.xml中添加action,使用通配符的方式 , 注意这里和单独struts2不同的地方: class属性指向的是bean 的 id ,这里我们配置bean采用spring ...

    Spring Security 中文教程.pdf

    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整合XssFilter,Jsoup等实现请求参数的过滤,处理Xss攻击及sql注入.zip

    原理过程 Springboot中会使用FilterRegistrationBean来注册Filter,Filter是Servlet规范里面的,属于容器范围,Springboot中没有web.xml,那Springboot中,不用管Filter是如何交给Ser...SpringBoot整合XssFilter,...

    SpringSecurity 3.0.1.RELEASE.CHM

    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. ...

    Spring Security-3.0.1中文官方文档(翻译版)

    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知识点整理

    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...

    springboot参考指南

    使用一个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. 测试...

    ssh(structs,spring,hibernate)框架中的上传下载

    3在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler处理Oracle数据库的Blob类型字段。  通过这样的设置和配置,我们就可以象持久化表的一般字段类型一样处理Blob字段了。  以上是Spring+...

    webjars-webfilter-resolver:Webfilter可以自动解决webjar的问题,而无需使用类似于Spring Boot的版本

    该Webfilter对Java EE(或其他实现Servlet 3.1 API的Web容器)执行相同的操作。 特征 该Webfilter支持两种响应服务方法(行为)。 响应服务方法 解释 重新定向 对webjars/foo/bar.js将通过返回重定向标头来解决。 ...

    example-spring-boot-embedded-felix:测试如何将Apache Felix嵌入到Spring Boot应用程序中

    使用标准的注解(例如Spring Web控制器和ServletFilter等),使用普通jar添加功能 自动检测并提供嵌入式静态资源 Sprint Boot 将应用程序入口点创建为@SpringBootApplication 自定义Spring Boot启动横幅 将...

    Java中核心注解的作用及其使用,了解Spring容器装载的过程和机制,自定义注解来实现自动配置项目依赖环境,包括mybatis、Dubbo、log4j、RabbitMQ、redis相关等自动配置

    Java中核心注解的作用及其使用,了解Spring容器装载的过程和机制,自定义注解来实现自动配置项目依赖环境,包括mybatis、Dubbo、log4j、RabbitMQ、redis相关等自动配置。 springboot 核心注解 主要注解有: @...

    SpringBoot 注册自己的Servlet(三种方式)(源代码)

    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类和数据库表关联的映射文件 ...

    Spring深入理解

    这张图上展示了一个基于SSH,B/S结构的单体Java应用的搭建过程,首先通过浏览器进入到Filter拦截器,进入到Structs2,通过Service层进入到Hibernate,从而进行数据库,经过而这整个过程都是由SpringIOC容器控制。...

    SpringMVC+mybatis-framework-bootstrap

    实际使用shiro的时候大部分都是和spring等框架结合使用,主要就是配置web.xml将shiro的filter和spring容器bean的filter关联起来,生命周期由servlet容器来控制,然后配置shiro的spring的xml文件,其中主要配置shiro...

    SpringFilter:Springboot过滤器示例

    弹簧过滤器 [MVC生命周期](#MVC生命周期) [如何使用过滤器](#如何使用... 因为它是一个Spring容器,所以它可以注入其他bean并具有良好的可用性。 因为可以使用其他bean,所以将实现证书,授权等。 如何使用过滤

Global site tag (gtag.js) - Google Analytics