• 静思
  • 吴言片语
    • 吴言
    • 片语
    • 杂七杂八
  • 死于青春
    • 一路走好
  • 乌合麒麟
  • 纪念
    • 5.12
    • 3.23
  • GitHub
    • A List of Post-mortems
    • The Art of Command Line
  • 关于
    • Privacy Policy

程序员的信仰

金鳞岂是池中物,一遇风云便化龙

HOME » 技术生活 » 使用FilterServlet对页面进行转码

使用FilterServlet对页面进行转码

2005 年 11 月 4 日 @ 下午 7:42 by Jay | 被踩了 2,677 脚

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

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

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

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.log4j.*;
 
public class CharsetFilter extends HttpServlet implements Filter{
  private static Logger logger = Logger.getLogger("Filter servlet");

  public void init(FilterConfig filterConfig) throws ServletException{
  }

  public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain){
    if(request != null){
      String charset = request.getCharacterEncoding();
      if(charset == null || !charset.equalsIgnoreCase("gbk"))
        try{
          request.setCharacterEncoding("GBK");
        }
        catch(UnsupportedEncodingException ex){
          logger.warn(ex.getMessage());
        }
    }
    try{
      filterChain.doFilter(request,response); // 递交责任链下一环
    }
    catch(Exception ex){
      logger.error(ex.getMessage());
    }
  }

  public void destroy(){
  }
}

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


  charsetfilter
  pqp.servlet.CharsetFilter


  charsetfilter
  /*
  REQUEST

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


-- EOF --

除非注明(如“转载”、“[zz]”等),本博文章皆为原创内容,转载时请注明: 「转载自程序员的信仰©」
本文链接地址:使用FilterServlet对页面进行转码

分享

  • 点击分享到 Facebook (在新窗口中打开) Facebook
  • 点击以分享到 X(在新窗口中打开) X
  • 更多
  • 点击分享到Reddit(在新窗口中打开) Reddit
  • 点击分享到Telegram(在新窗口中打开) Telegram
  • 点击以在 Mastodon 上共享(在新窗口中打开) Mastodon

赞过:

赞 正在加载……

相关

Today on history:

【2015】由小米99圈铁旗舰而发
【2011】梦娜·辛普森悼兄长史蒂夫·乔布斯 [zz]
Posted in: 技术生活 Tagged: java, servlet, tips
← 发如雪 [Jay] – 比《东风破》更感人的歌
Borland Look and Feel下载 →

android (9) apple (20) augmentum (9) Beijing (21) bt (8) career (28) coding (38) firefox (10) google (36) hibernate (11) ibm (11) iphone (10) java (93) linux (16) m$ (26) mac (58) macos (27) nazca (9) olympics (8) oo (8) playstation (10) rip (8) Shanghai (39) spring (9) tips (45) tommy emmanuel (8) ubuntu (12) usa (23) windows (9) 北航 (17) 博客 (29) 吐槽 (8) 周末 (9) 和谐社会 (26) 小资 (11) 愤青 (40) 方言 (10) 朋友 (77) 歌词 (8) 烟酒不分家 (18) 爱国 (19) 爱情 (8) 犯二 (15) 破解 (8) 足球 (11)

烫手山芋

  • 再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~ - 被踩了 27,831 脚
  • 生活,就是一个期待跟着一个期待 - 被踩了 21,390 脚
  • 星巴克饮品缩写大全(Starbucks Drink ID Codes)[zz] - 被踩了 18,484 脚
  • 从一个全角冒号说一下我为什么不感冒iOS - 被踩了 14,420 脚
  • 有关Character.isLetter()和Character.isLetterOrDigit() - 被踩了 13,625 脚

刚拍的砖

  • leo 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 花 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》
  • 无名氏 发表在《从一个全角冒号说一下我为什么不感冒iOS》
  • Jay 发表在《Mac OS geek级问题》
  • Wei Wang 发表在《再谈苹果的输入法:这一次是靠OS X自带的输入法来翻身的~》

随便看看

  • 足球告别赛9 年 ago
  • About save/persist, update/merge in JPA/Hibernate14 年 ago
  • 《南方周末》2013年新年献词(被修改版 VS 原版)10 年 ago
  • 黑色毛衣 [Jay]20 年 ago
  • Tommy Emmanuel Hyper Chord 09', Beijing16 年 ago

文以类聚

光阴似箭

其他操作

  • 登录
  • 条目 feed
  • 评论 feed
  • WordPress.org

Copyright © 2025 程序员的信仰.

Jay's Omega WordPress Theme by Jay

 

正在加载评论...
 

    %d