`

使用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后对性能方面的影响未知,大家可以讨论一下。
分享到:
评论

相关推荐

    servlet四个有用的过滤器

    根据提供的信息,我们可以总结出以下关于servlet过滤器的相关知识点...综上所述,通过使用这些特定功能的过滤器,开发者可以在不修改具体业务逻辑的情况下对整个Web应用进行增强和优化,从而提高系统的健壮性和可用性。

    页面间跳转乱码

    - 对于Servlet容器,可以通过`web.xml`中的`&lt;filter&gt;`元素来设置过滤器,强制所有请求都使用UTF-8编码。 - 对于Spring框架,可以使用`CharacterEncodingFilter`。 2. **设置客户端编码**: - 在HTML表单中明确...

    JSPSmartUpload上传文件乱码解决纪实+UploadBean上传解决方案

    通常,需要在请求处理阶段就正确地处理字符编码,例如在Servlet或Filter中对请求参数进行转码。 解决JSPSmartUpload上传文件乱码问题的关键在于理解字符编码的流转过程,确保从客户端到服务器端的每个环节都使用...

    中文乱码解决

    对于文件上传(enctype="multipart/form-data"),需要在Servlet或Filter中对文件内容进行编码转换。 总结来说,解决Java和JSP中的中文乱码问题,关键在于理解编码的层次和转换规则,确保编码一致性和适时的转换...

    JSP中文乱码问题完全处理方案.docx

    总的来说,处理JSP中文乱码问题的关键在于确保编码的一致性,从页面编码、URL编码到请求处理的编码,都需要进行适当的配置和调整。通过理解这些基础知识,开发者可以更有效地解决这类问题,提高开发效率。

    教会你如何在java中建过滤器

    当用户登录页面输入中文时,后台 Servlet 可能会出现乱码问题。这是因为 Servlet 默认使用 ISO-8859-1 格式编码,而中文需要使用 GBK 编码。使用过滤器可以将 ISO-8859-1 转码为 GBK,解决中文问题。 过滤器也可以...

    jsp传参 servlet接收中文乱码问题的解决方法

    在Java Web开发中,我们经常会遇到中文乱码的问题,特别是在JSP页面向Servlet传递参数时。这通常是由于字符编码不一致导致的。以下是一些解决此类问题的方法: 1. **项目编码设置**: 首先,确保整个项目的编码...

    JSP乱码 N种解决方案

    - 字符编码是计算机对文字进行存储和处理的标准,常见的有ASCII、GBK、UTF-8等。 - JSP页面默认使用ISO-8859-1编码,如果不做特殊处理,中文字符可能会出现乱码。 2. **JSP文件本身的编码设置** - 确保你的JSP...

    J2ee应用中文乱码问题解决方案.doc

    - 配置`web.xml`中的`&lt;filter&gt;`和`&lt;filter-mapping&gt;`,使用`CharacterEncodingFilter`过滤器设定全局编码。 总结来说,解决J2EE应用中文乱码问题的关键在于理解字符集的原理,并在每个可能引起乱码的环节进行相应...

    java知识整理

    - 当表单使用POST方法提交且Tomcat服务器配置为"utf-8"时,通常无需在Action中进行转码。 - 如果服务器配置为"gbk"编码,那么在Action中需要使用类似`new String(bytes, "ISO-8859-1")`的方式转换为正确的编码格式...

    视频播放系统

    过滤器(Filter)在Java Web应用程序中扮演着中间件的角色,它可以对HTTP请求和响应进行拦截、修改或转发。在视频播放系统中,过滤器可能被用于实现权限控制,例如检查用户是否已登录才能观看某些视频,或者对上传的...

    基于jsp的在线视频教育系统源码数据库.zip

    下面将对这个系统的核心技术和关键模块进行详细阐述。 一、JSP技术介绍 JSP是Java EE平台中的动态网页技术,它允许开发者在HTML页面中嵌入Java代码,实现服务器端的业务逻辑处理。JSP通过将HTML模板与Java代码分离...

    学习系统(jsp)

    可能使用了Servlet或Filter来处理文件上传,同时需要考虑安全性,如防止恶意文件和过大文件。 8. **在线视频播放**:为了实现在网页上播放视频,项目可能使用了HTML5的`&lt;video&gt;`标签,或者引入了如Flash或HTML5的...

    软件开发案例复习提纲

    11. **Filter**:在Servlet容器中拦截请求和响应,必须继承`Filter`类。 **简答题**: 1. **JSP**:Java Server Pages,用于生成动态网页,它允许将Java代码嵌入HTML中,简化了动态内容的生成。 2. **JSP include...

Global site tag (gtag.js) - Google Analytics