正在做的项目中一功能,打开tomcat的运行的项目一个文件夹中 中文的名称的word文档 如:http://127.0.0.1:8088/hgjj_xsfx/uploadFile/statisticGazette/2008年国民经济和社会发展统计公报.doc  在IE打开。
   问题主要是tomcat对中文路径的解码问题?
   有一种非常简洁的方法是在tomcat中server.xml中的connector连接配置中加URIEncoding="UTF-8"、
useBodyEncodingForURI="true"两句就可以了。但是我们有个‘牛人’愣是怕项目经理说服了‘说系统的配置最好不要改。’
 求救了N多人,js的encodeURI、encodeURIComponent等方法和java类用了java.net.URLEncoder.encode(typeName,"utf-8")还有apache的commons的ecodec工具包中的方法也用到了。最终问题没有解决!
   tomcat的底层对url路径的编码是iso-8859-1,我请求的路径中包含中文,该‘中文字符串’又是tomcat中 运行的项目 中 一个文件夹中的一个word文档名称。
该中文的word文档要通过IE访问的形式在IE中打开该word文档。
   问题就是这样,谢谢各位大侠。

解决方案 »

  1.   

    两次encodeURI,在jsp里调用一次java.net.URLDecoder
      

  2.   

    加个过滤器import java.io.IOException;
    import java.net.URLDecoder;import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;public class UrlFilter implements Filter {    public final static String DEFAULT_URI_ENCODE = "UTF-8";
        
        private FilterConfig config = null;
        private String encode = null;
        
        @Override
        public void init(FilterConfig config) throws ServletException {
            this.config = config;
            this.encode = config.getInitParameter("DEFAULT_URI_ENCODE");
            if(this.encode == null) {
                this.encode = DEFAULT_URI_ENCODE;
            }
        }    @Override
        public void doFilter(ServletRequest req, ServletResponse res,
                FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) req;
            String uri = request.getRequestURI();
            String ch = URLDecoder.decode(uri, encode);
            if(uri.equals(ch)) {
                chain.doFilter(req, res);
                return;
            }
            ch = ch.substring(request.getContextPath().length());
            config.getServletContext().getRequestDispatcher(ch).forward(req, res);
        }        @Override
        public void destroy() {
            config = null;
        }
    }
      <filter>
        <filter-name>urlFilter</filter-name>
        <filter-class>com.test.UrlFilter</filter-class>
        <init-param>
          <param-name>DEFAULT_URI_ENCODE</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>urlFilter</filter-name>
        <url-pattern>*.doc</url-pattern>
      </filter-mapping>
      

  3.   

    我出现过这个问题,在网上一直找不到好的答案,后来终于解决了
       现在跟大家说说
     首先,我的需求是,在IE和Firefox上显示pdf文档,并且显示时pdf还有中文命名的
    在网上查了一下,说改tomcat中server.xml中的encoding编码就可以了
      其实,是不能完全解决的,比如你改成了utf-8,那么该pdf只能在firefox和谷歌浏览器中显示
                                    改成gb2312,也只能在IE和360浏览器中显示(当然,我这里用的测试的浏览器都是比较高的版本,大家可以参看我的回复时间大概算一下我做测试的浏览器版本)
          不能兼容IE和Firefox的原因也很简单,IE的编码格式默认是gb2312,而Firxfox的却是utf-8
       所以,你可以在网站的后台将你需要显示的那个pdf的url进行编码,但是编码的时候也要注意
       不要将整个url进行编码,因为在编码的时候,url里面如果包含“/”等内容,一样也会被编码掉
        所以在编码时,你将中文部分选出来进行编码,(我的做法是,截取url,只将中文名字的pdf文档进行编码),之前的“/”和一些英文都不进行编码,在拼接起来发送到前台,再显示就可以了
          (里面具体的代码我就不写了,稍微负责一点点的人,从网上查一下很快就可以解决的,Good luck)
      

  4.   

    有什么问题可以Email我 [email protected] River