tomcat部署在centos6.8上的乱码问题

web访问经常会莫名其妙的出现各种乱码问题。按照我自己的理解,设置一个charSet的过滤器,代码如下:import java.io.IOException;

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 java.io.ByteArrayOutputStream;
import java.io.OutputStreamWriter;  

public class Charset implements Filter {

    @Override//过滤器销毁
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override//chain我感觉是对request的一次转发
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //设置字符编码,解决乱码问题
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("chatset=utf-8");
        chain.doFilter(request, response);//让目标执行,放行

    }

    @Override//过滤器初始化
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

      private static String getDefaultCharSet() {
            OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
            String enc = writer.getEncoding();
            return enc;
        }  

}

然后在tomcat的conf目录下server.xml添加那么一句   URIEncoding="UTF-8"

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"   URIEncoding="UTF-8"   />

最后记得每个jsp的开头都要记得  pageEncoding="utf-8"

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

基本上javaWeb的开发就不会出现什么乱码问题了。 

然后想得深入些,String类里面有个方法  String.getBytes()  ,这个方法JDK的源码是这样子的

@Deprecated
    public void getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin) {
        if (srcBegin < 0) {
            throw new StringIndexOutOfBoundsException(srcBegin);
        }
        if (srcEnd > value.length) {
            throw new StringIndexOutOfBoundsException(srcEnd);
        }
        if (srcBegin > srcEnd) {
            throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
        }
        int j = dstBegin;
        int n = srcEnd;
        int i = srcBegin;
        char[] val = value;   /* avoid getfield opcode */

        while (i < n) {
            dst[j++] = (byte)val[i++];
        }
    }

    /**
     * Encodes this {@code String} into a sequence of bytes using the named
     * charset, storing the result into a new byte array.
     *
     * <p> The behavior of this method when this string cannot be encoded in
     * the given charset is unspecified.  The {@link
     * java.nio.charset.CharsetEncoder} class should be used when more control
     * over the encoding process is required.
     *
     * @param  charsetName
     *         The name of a supported {@linkplain java.nio.charset.Charset
     *         charset}
     *
     * @return  The resultant byte array
     *
     * @throws  UnsupportedEncodingException
     *          If the named charset is not supported
     *
     * @since  JDK1.1
     */
    public byte[] getBytes(String charsetName)
            throws UnsupportedEncodingException {
        if (charsetName == null) throw new NullPointerException();
        return StringCoding.encode(charsetName, value, 0, value.length);
    }

    /**
     * Encodes this {@code String} into a sequence of bytes using the given
     * {@linkplain java.nio.charset.Charset charset}, storing the result into a
     * new byte array.
     *
     * <p> This method always replaces malformed-input and unmappable-character
     * sequences with this charset‘s default replacement byte array.  The
     * {@link java.nio.charset.CharsetEncoder} class should be used when more
     * control over the encoding process is required.
     *
     * @param  charset
     *         The {@linkplain java.nio.charset.Charset} to be used to encode
     *         the {@code String}
     *
     * @return  The resultant byte array
     *
     * @since  1.6
     */
    public byte[] getBytes(Charset charset) {
        if (charset == null) throw new NullPointerException();
        return StringCoding.encode(charset, value, 0, value.length);
    }

    /**
     * Encodes this {@code String} into a sequence of bytes using the
     * platform‘s default charset, storing the result into a new byte array.
     *
     * <p> The behavior of this method when this string cannot be encoded in
     * the default charset is unspecified.  The {@link
     * java.nio.charset.CharsetEncoder} class should be used when more control
     * over the encoding process is required.
     *
     * @return  The resultant byte array
     *
     * @since      JDK1.1
     */
    public byte[] getBytes() {
        return StringCoding.encode(value, 0, value.length);
    }

如果不指定String.getBytes()里面的参数,它会调用系统默认的参数,也就是java虚拟机的默认参数,查看这个参数的方法如下所示

   System.out.println("Default Charset=" + java.nio.charset.Charset.defaultCharset());
   System.out.println("file.encoding=" + System.getProperty("file.encoding"));
   System.out.println("Default Charset=" + java.nio.charset.Charset.defaultCharset());
   System.out.println("Default Charset in Use=" + getDefaultCharSet());  

值得一提的是,当你使用sftp工具上传文件至服务器时,如果没有指定sftp协议的文件名格式,sftp工具会以你默认系统的编码(大部分windows的编码都是GBK)传送中文文件名给服务器,这时候如果服务器默认的编码方式不是GBK,那么你上传的文件名在服务器端显示都是乱码。

centos查看系统的编码方式的命令是  echo $LAN ,也可以输入 locale  命令查看系统的编码。

在tomcat7中,用get方式访问中文名的文件,如uploads/%E6%B5%8B%E8%AF%95.mp3

浏览器本身会借助url.enCode()把中文名,空格等等转化为%E8等等的web地址传输编码格式,然后servlet接收到这个地址后会先url.unCode换成普通的编码,然后再根据request.setContentType="UTF-8"来换成中文名,但是这样子设置tomcat的 URIEncoding="UTF-8" 又是闹得哪样?

所以说编码真的是一个很神奇的玩意,此帖后面还会更新。

时间: 2024-11-03 15:29:55

tomcat部署在centos6.8上的乱码问题的相关文章

centos服务器上java环境和tomcat部署过程以及mysql简单修改

本文记录了centos安装完成后java.tomcat部署以及针对olds网站系统mysql数据库的修改,红色部分为实际操作的过程. 初始条件:centos安装完成(x86桌面版本5.5),mysql安装完成. 基本知识:会使用centos终端(下文命令中最前面的#符号是默认的终端命令行提示符,不需要实际输入). 一.JAVA安装 1. centos自带了OPENJDK,一般不用这个,需要卸载. 用命令java -version 查看java版本,会有下面的信息: javaversion "1.

基于Centos6的tomcat部署

基于Centos6的tomcat部署 说明:在安装tomcat之前必须先安装JDK,JDK的全称是java development kit,是sun公司免费提供的java语言的软件开发工具包,其中包含java虚拟机(JVM),编写好的java源程序经过编译可形成java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了java的跨平台性. 部署步骤: 一.java环境的配置 安装JDK,配置java环境 将jdk-8u131-linux-i586.gz解压: [[email

myeclipse中tomcat部署编译jsp页面后,浏览器显示中文乱码

我就新建一个空的web工程,里面就一个index.jsp,然后我将其部署运行.以下是页面代码 以上代码就是index.jsp页面的.以下为在网上找了一点解决办法,tomcat server.xml中改的一部分 直接部署运行,浏览器就出现乱码了 我终于找到了问题的根本了.我用的myeclipse2016版的嘛,是ide的问题. 就是上图中把像眼睛一样的东西关掉,就可以了.如果还是不行,多试试几次. 来源:https://segmentfault.com/q/1010000005983988

Centos6.2上做nginx和tomcat的集成及负载均衡(已实践)

Centos6.2上做nginx和tomcat的集成及负载均衡 ---------------------------------------------------------Jdk------------------------------------------------------------------- 1:centos上安装jdk6 Jdk: jdk-6u34-linux-i586.bin  安装命令: ./jdk-1_5_0_06-linux-i586.bin 配置环境变量如下

Tomcat部署项目乱码问题总结

打包好的war包放在tomcat下,有时会出现中文乱码的情况.首先应当确定项目的编码格式,tomcat的编码格式,以及cmd命令行的编码格式. 项目编码 将要输出到控制台或日志的字符串转为UTF-8 1 String words= "utf-8编码"; 2 words = new String(words.getBytes("GBK"),"UTF-8"); 重新打包运行,查看是否乱码. tomcat编码 tomcat启动时默认使用系统编码,可更改

apache整合tomcat部署集群

近日,由于公司项目需要,所以学习了apache整合tomcat以及集群的一些知识. 所以做下笔记日后回顾可以用到. apache只有处理静态事物的能力, 而tomcat的强项就是处理动态的请求,所以apache和tomcat整合相互取长补短,由apache作为入口,如果是请求静态页面或者是静态文件,由apache直接提供,如果是请求动态页面,则让apache分发到tomcat,由tomcat处理以后再响应给客户端. apache和tomcat的整合需要准备的一些软件列表: 图1 说明: 1.首先

Tomcat部署Web应用方法总结

Tomcat部署Web应用方法总结在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署. 在下文中$CATALINA_HOME 指的是Tomcat根目录. 一.静态部署静态部署指的是我们在服务器启动之前部署我们的程序,只有当服务器启动之后,我们的Web应用程序才能访问. 以下3种方式都可以部署:(以maintain项目为例说明,maintain目录假设是F:/maintain) 1.利用Tomcat自动部署将maintain目录拷贝到$CATALINA_HOME/webap

Tomcat部署Web应用方面的一些问题(多Tomcat、指定Java、字节码替换)

这篇博文操作的系统环境为CentOS系统,目标是在该系统中部署一个Tomcat以及跑在该Tomcat上的一个Java Web应用.部署的系统环境有限制,主要表现在:该主机上已部署Tomcat,新部署的Tomcat应不影响原Tomcat及相应应用的访问:此外,系统上已安装某一版本的Java,已设置JAVA_HOME等环境变量,而当前应用依赖另一版本的Java, 因此需要在不影响原应用.环境变量配置的基础上解决依赖问题. Tomcat安装 安装前需准备好Java环境,配置好JAVA_HOME环境变量

Tomcat 部署

<CATALINA_HOME>/webapps: Tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录. 1.war包部署:  将需要发布的web应用打成war文件, (例如:ROOT.war) 拷贝到<CATALINA_HOME>/webapps下, 启动Tomcat, 如果是ROOT.war,直接通过http://ip:port/即可访问 如果是xxxx.war,可通过http://ip:port/xxxx/访问 这种方式比较简单,但是web应用程序必须在we