最近作一個(gè)項目,基于Tomcat和LDAP技術(shù)的一個(gè)應用,實(shí)在厭煩了以前在每次調用request.getParameter(...)或request.getParameterValues(..)方法是做字符集轉換的操作。
利用ServletFilter可以很好的實(shí)現一個(gè)對應用層透明的字符集轉換過(guò)濾器,不需要應用中的Servlet對字符集進(jìn)行轉換,只需要我們在Web Deployment Description文件中安裝一個(gè)用于完成字符集轉換的ServletFilter就可以了。
這個(gè)ServletFilter的內容如下:
// **** I18nServletFilter.java源程序 *******************************************************
package com.npower.im.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
* <p>Company: NPower Technology Ltd.</p>
* @author Zhao DongLu
* @version 1.0
*/
public class I18nServletFilter extends HttpServlet implements Filter {
private FilterConfig filterConfig;
private String charset = "UTF-8";
//Handle the passed-in FilterConfig
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.charset = filterConfig.getInitParameter("charset");
if (this.charset == null || this.charset.trim().length() == 0) {
this.charset = null;
}
}
//Process the request/response pair
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) {
try {
if (this.charset != null) {
I18nHttpServletRequestWrapper requestWrapper = new I18nHttpServletRequestWrapper( (HttpServletRequest) request, charset);
filterChain.doFilter(requestWrapper, response);
} else {
filterChain.doFilter(request, response);
}
} catch(ServletException sx) {
filterConfig.getServletContext().log(sx.getMessage());
} catch(IOException iox) {
filterConfig.getServletContext().log(iox.getMessage());
}
}
//Clean up resources
public void destroy() {
super.destroy();
}
}
// **** I18nHttpServletRequestWrapper.java源程序 *******************************************************
package com.npower.im.servlet;
import java.util.*;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import com.npower.im.config.Global;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class I18nHttpServletRequestWrapper extends HttpServletRequestWrapper {
private Map hashMap = new HashMap();
private String charset = "iso-8859-1";
public I18nHttpServletRequestWrapper(HttpServletRequest request, String charset) {
super(request);
this.charset = charset;
initParameterMap(request);
}
private void initParameterMap(HttpServletRequest request) {
if (request == null) {
return;
}
Map map = request.getParameterMap();
Set names = map.keySet();
for (Iterator i = names.iterator(); i.hasNext(); ) {
String name = (String)i.next();
this.hashMap.put(name, map.get(name));
}
}
public String getParameter(String name) {
String[] values = this.getParameterValues(name);
if (values != null && values.length > 0) {
return values[0];
} else {
return null;
}
}
public String[] getParameterValues(String name) {
String[] values = (String[])this.hashMap.get(name);
if (values == null) {
return null;
}
String[] result = new String[values.length];
for (int i = 0; values != null && i < values.length; i++) {
result[i] = convertCharset(values[i]);
}
return result;
}
private String convertCharset(String str) {
if (str == null) {
return null;
}
try {
byte[] bs = str.getBytes("iso-8859-1");
String result = new String(bs, this.charset);
return result;
} catch (UnsupportedEncodingException ex) {
Global.getLogger().fatal("I18nHttpServletRequestWrapper:" + this.charset, ex);
}
return null;
}
}
// *** 在web.xml文件中增加如下內容:
<filter>
<filter-name>i18nservletfilter</filter-name>
<filter-class>com.npower.im.servlet.I18nServletFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>i18nservletfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注意:其中的參數charset有你應用的HTML的字符集來(lái)決定,一般為GBK
采用上述方式,通過(guò)一個(gè)ServletFilter自動(dòng)對每一次提交的參數進(jìn)行字符集裝換,而不需要應用中每一次調用都作一次轉換。同時(shí)也給大家一個(gè)參考,我們應該在一些場(chǎng)合使用ServletFilter。
趙冬路,IEI科技公司
聯(lián)系客服