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
// 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);
}
}
}