Intercepting Filter(拦截过滤器?)
这个不用多说了,拦截用户的请求,在WEB中实现个Filter接口,然后配置在WEB.XML下就可以用,FilterManager已经由服务器提供商写好了,基于应用上只需实现就可以了,这里关注的是这个模式解决的问题。
1.客户有没被授权?
2.客户是否具有有效会话?
3.客户IP地址是否来自信任网络段?
4.客户端传输使用何种方法编码?
5.客户端浏览器类型我们支持吗?
所有这些将决定请求的转发,以后后续的流程。如果不用Filter,则需要在其后的控制中做条件测试,然后再处理请求,一般用嵌套IF/ELSE就可完成。但缺点在于,
不够简练,多个控制做的条件测试都相同。
将过滤和控制放在一起,不够灵活,过滤通常是可变的,比如信任IP地址段,或者是过滤的条件发生变化,都会带来对所有控制的变更。
灵活和简单的解决方法就是用一种简单的可增减组件的机制,使得每个组件完成特殊的过滤请求。
(原文:
The key to solving this problem in a flexible and unobtrusive manner is to have a simple mechanism for adding and removing processing components, in which each component completes a specific filtering action.)
贴个Filter
public class StandardEncodeFilter extends BaseEncodeFilter {
// Creates new StandardEncodeFilter
public StandardEncodeFilter() { }
public void doFilter
(javax.servlet.ServletRequest
servletRequest,
javax.servlet.ServletResponse
servletResponse,
javax.servlet.FilterChain
filterChain)
throws java.io.IOException,
javax.servlet.ServletException {
String contentType =
servletRequest.getContentType();
if ((contentType == null) ||
contentType.equalsIgnoreCase(
"application/x-www-form-urlencoded")) {
translateParamsToAttributes
(servletRequest,servletResponse);
}
filterChain.doFilter(servletRequest,
servletResponse);
}
private void translateParamsToAttributes(
ServletRequest request,
ServletResponse response){
Enumeration paramNames =
request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String)
paramNames.nextElement();
String [] values;
values = request.getParameterValues
(paramName);
System.err.println("paramName = "
+ paramName);
if (values.length == 1)
request.setAttribute(paramName,
values[0]);
else
request.setAttribute(paramName, values);
}
}
}