过滤器的概念
过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息过滤。
过滤器的工作原理
过滤器的生命周期
过滤器的API
多个过滤器下的应用
过滤器的分类
Servlet2.5
REQUEST——用户直接访问页面时,Web容器将会调用过滤器
ERROR——目标资源是通过声明式异常处理机制调用时,过滤器将被调用
FORWARD——目标资源是通过RequestDispatcher的forward方法调用时,过滤器将被调用
INCLUDE——目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用
Servlet3.0
ASYNC——目标资源是异步处理时,过滤器将被调用
过滤器在实际项目中的应用场景
1.对用户请求进行统一认证
2.编码转换
3.对用户发送的数据进行过滤替换
4.转换图像格式
5.对响应的内容进行压缩
过滤器的实例
/**
* 过滤器类
* 过滤请求参数content的前后空格
* @author yonggang
* @date 2015-4-24 上午12:12:58
*/
@Component
public class ParamFilter implements Filter{
@Override
public void init( FilterConfig filterConfig ) throws ServletException {
}
@Override
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException {
String content = request.getParameter( "content" );
Map<String, String[]> newParams = new HashMap<String, String[]>( request.getParameterMap() );
if( StringUtils.isNotBlank( content ) ) {
newParams.put( "content", new String[] { content.trim() } );
}
chain.doFilter( new ParameterRequestWrapper( ( HttpServletRequest )request, newParams ), response );
}
@Override
public void destroy() {
}
}
/**
* 请求包装类<br>
* 用于替换原有request的params<br>
*
* @author yonggang
* @date 2015-4-7 下午8:56:44
*/
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params;
public ParameterRequestWrapper( HttpServletRequest request, Map<String, String[]> newParams ) {
super( request );
this.params = newParams;
}
@Override
public String getParameter( String name ) {
String result = "";
Object v = params.get( name );
if( v == null ) {
result = null;
} else if( v instanceof String[] ) {
String[] strArr = ( String[] )v;
if( strArr.length > 0 ) {
result = strArr[ 0 ];
} else {
result = null;
}
} else if( v instanceof String ) {
result = ( String )v;
} else {
result = v.toString();
}
return result;
}
@Override
public Map<String, String[]> getParameterMap() {
return params;
}
@Override
public Enumeration<String> getParameterNames() {
return new Vector<String>( params.keySet() ).elements();
}
@Override
public String[] getParameterValues( String name ) {
String[] result = null;
Object v = params.get( name );
if( v == null ) {
result = null;
} else if( v instanceof String[] ) {
result = ( String[] )v;
} else if( v instanceof String ) {
result = new String[] { ( String )v };
} else {
result = new String[] { v.toString() };
}
return result;
}
}
<filter>
<filter-name>paramFilter </filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>paramFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>