将应用从weblogic移植到tomcat时学习了一个servlet规范

阅读更多
一个遗留web网页(gbk编码)需要POST方式请求一个servlet应用(utf-8), 得写一个filter进行转码。关于form表单提交的编码问题,可以参考这个: Java Web应用的form文字编码问题,或者 在IE下面指定表单编码方式。

 

参照上面的第一个文档,这个filter很好写:

 

public void doFilter(ServletRequest servletRequest,
                       ServletResponse servletResponse,
                       FilterChain filterChain) throws
      IOException, ServletException {
    if(servletRequest.getCharacterEncoding()==null){
      String encoding = servletRequest.getParameter("_charset_");
      if(encoding == null){
        encoding = _defaultEncoding;
      }
      if (encoding != null) {
        servletRequest.setCharacterEncoding(encoding);
        if(LOG.isDebugEnabled()){
          LOG.debug("Set request encoding to:"+encoding);
        }
      }
    }
    filterChain.doFilter(servletRequest, servletResponse);
  }
 

 

 

这段代码在weblogic8下面应用良好,gbk编码的网页很好的提交到一个utf-8编码的servlet应用,没有其他的额外转码工作。

 

当移植到tomcat6下面时,乱码问题出现了。即使通过一个utf-8编码的网页来提交依然乱码,request中的数据是iso-8859-1编码。很久没有碰到过乱码问题了,于是我又不自信起来,找了每个环节的问题。最后终于发现是这个filter没有遵循一个servlet规范,ServletRequest的文档中说:

setCharacterEncoding

public void setCharacterEncoding(java.lang.String env)
                          throws java.io.UnsupportedEncodingException
Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().
Parameters:
a - String containing the name of the chararacter encoding.
Throws:
java.io.UnsupportedEncodingException - if this is not a valid encoding

 

我错了,光看方法名字就开练,api文档看得不够仔细。在这次迁移工作中,学了这么一个servlet规范。

 

 

 

 

 

你可能感兴趣的:(Servlet,Weblogic,Tomcat,IE,Web)