`

使用FilterServlet对页面进行转码

阅读更多
相信很多朋友在使用JSP/Servlet等技术进行页面编程的时候都会或多或少地遇到乱码问题。解决的方法有很多,比较常见的是手动对所有可能包含中文的字符串进行转码:

String latin = ;
String gbk 
= new String(latin.getBytes("iso-8859-1"),"gbk");

这个方法过去我也比较常用,的确有效,但很累赘耶,丝毫没有模式之美,有没有更优雅的方法呢?如果你和我一样有疑虑的话,可以考虑使用FilterServlet:

 1import java.io.*;
 2import javax.servlet.*;
 3import javax.servlet.http.*;
 4
 5import org.apache.log4j.*;
 6
 7public class CharsetFilter
 8    extends HttpServlet implements Filter{
 9  private static Logger logger = Logger.getLogger("Filter servlet");
10
11  public void init(FilterConfig filterConfig)
12      throws ServletException{
13  }

14
15  public void doFilter(ServletRequest request,ServletResponse response,
16      FilterChain filterChain){
17    if(request != null){
18      String charset = request.getCharacterEncoding();
19      if(charset == null || !charset.equalsIgnoreCase("gbk"))
20        try{
21          request.setCharacterEncoding("GBK");
22        }

23        catch(UnsupportedEncodingException ex){
24          logger.warn(ex.getMessage());
25        }

26    }

27    try{
28      filterChain.doFilter(request,response); // 递交责任链下一环
29    }

30    catch(Exception ex){
31      logger.error(ex.getMessage());
32    }

33  }

34
35  public void destroy(){
36  }

37}

38

FilterServlet内部应该使用责任链(Chain of Responsibility)实现,在这里我们把对字符串的转码做为责任链中的一环,从上一环拿到request,处理后交给链的下一环。另外需要在web.xml里做些配置:

<filter>
  
<filter-name>charsetfilter</filter-name>
  
<filter-class>pqp.servlet.CharsetFilter</filter-class>
</filter>
<filter-mapping>
  
<filter-name>charsetfilter</filter-name>
  
<url-pattern>/*</url-pattern>
  
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

其中“REQUEST”指定了filter拦截的类型,有REQUEST、FORWARD、ERROR和INCLUDE,可组合选择,一般选REQUEST。全部设置好后重新打包、部署,这样Servlet就可以自动把所有的request转换为GBK的字符集了,是不是很方便?但在这里加了filter后对性能方面的影响未知,大家可以讨论一下。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics