如题

idea 运行 tomcat 中文乱码

修改 VM 选项,在后面添加一行:-Dfile.encoding=UTF-8,重启 idea 生效。

  • 未打开项目时,Configure -> Edit Custom VM Options …
  • 已打开项目时,Help -> Edit Custom VM Options …

centOS

  1. 本方法同样适用于 tomcat 打印的控制台日志出现乱码的情况。
  2. 进入 tomcat bin 目录,找到 catalina.sh 的 JAVA_OPTS 配置项

    1
    2
    3
    4
    5
    6
    [root@localhost /]# cd /home/java_env/tomcat8.5.13/bin
    [root@localhost bin]# vi catalina.sh
    # 按 esc 键,输入 :/JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS,找到配置项 JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"
    JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"
    # 在后面加上 -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8,注意要用一个空格分开
    JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8"
  3. 重启 tomcat 生效。

windows 下

打开文件/tomcat/bin/catalina.bat
set “JAVA_OPTS= 的内容中添加选项-Dfile.encoding=GBK

后记,在另外一台 centos 服务器上,没有搞定

现象

乱码来自于 javamail 发邮件时抛的异常。
下面的并不总是会有,多数情况下发邮件都是正常的,由于是乱码,不知道是哪儿出问题了。网上提到的用户名、密码、端口,这些都是正确的。
而且在测试环境下发邮件也都是正常的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
TraceInfo:org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:424)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:345)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:340)
at com.maile360.crm.common.JavaMailHelper.sendHtmlMail(JavaMailHelper.java:68)
at crm.common.service.internal.ErrLogInnerService.emailErrInfo(ErrLogInnerService.java:103)
at crm.common.service.internal.ErrLogInnerService.addErrLogToFile(ErrLogInnerService.java:78)
at crm.common.service.internal.ErrLogInnerService.insertForScheduledTasks(ErrLogInnerService.java:46)
at crm.common.service.internal.ErrLogInnerService.insertForScheduledTasks(ErrLogInnerService.java:36)
at crm.task.order.internal.TBOrderSmsProcess.process(TBOrderSmsProcess.java:93)
at crm.task.order.internal.TBOrderSmsProcess.run(TBOrderSmsProcess.java:56)
at com.maile360.crm.task.boot.ScheduledTasks.tbOrderSmsProcess(ScheduledTasks.java:123)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.mail.AuthenticationFailedException: 535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:932)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:843)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:748)
at javax.mail.Service.connect(Service.java:366)
at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:501)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:421)
... 24 more

把异常写到文件里,下载文件,查看到的乱码是一致的。

尝试如下

  1. 在 catalina.sh 中加入:
    1. CATALINA_OPTS=-Dfile.encoding=”UTF-8”
    2. JAVA_OPTS=”$JAVA_OPTS -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=zh_CN -Dsun.jnu.encoding=UTF-8”
    3. 将 JAVA_OPTS 改为 JAVA_OPTS=”$JAVA_OPTS $JSSE_OPTS -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=zh_CN -Dsun.jnu.encoding=UTF-8”
    4. 将 server.xml 中的 Connector 加入 useBodyEncodingForURI 和 URIEncoding
      1
      2
      3
      4
      5
      <Connector port="18083" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443"
      useBodyEncodingForURI="true"
      URIEncoding="UTF-8"/>

结果

以失败告终!
暂时无解。

tomcat 相关文章