spirng MVC 接口层controller参数带中文乱码问题 分析过程

253 阅读1分钟

项目web.xml:

<init-param>
    <param-name>encoding</param-name>
    <param-value>utf8</param-value>
</init-param>

idea开发环境 workspace也已经设置成了 utf-8

分析了一遍,发现项目的编码都是utf-8,是没问题,说明问题出在了tomcat本身

  1. server.xml 发现 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1"redirectPort="8443" />是没有指定编码的。
  2. 解决:在 <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"  URIEncoding="UTF-8"/>加上URIEncoding="UTF-8。
  3. 重启项目

java转码方法

public static void main(String[] args) {
    //转码方法
    String encode = URLEncoder.encode("1+1");
    System.out.println("转码:" + encode);
    //解码方法
    String decode = URLDecoder.decode(encode);
    System.out.println("解码:" + decode);
}

tomcat的结构知识

#结构
bin (运行脚本)
conf (配置文件)
lib (核心库文件)
logs (日志目录)
temp (临时目录)
webapps (自动装载的应用程序的目录)
work (JVM临时文件目录[java.io.tmpdir])

#系统变量
#变量(很重要)
catalina.home 和
catalina.base 这两个属性仅在你需要安装多个Tomcat实例而不想安装多个软件备份的时候使用,这样能节省磁盘空间。
#实际用途中,运行多个应用时,就更改catalina.base , 然后启动tomcat就启动了服务
linux设置变量的命令

export CATALINA_BASE=/usr/local/tomcat${tomcat_version}/$i #服务地址
export catalina.home=你的tomcat地址

#linux
1、CATALINA_TMPDIR  指向临时目录temp的位置
2、catalina.home 指向公用信息的位置,就是bin和lib的父目录。
3、catalina.base 指向每个Tomcat目录私有信息的位置,
就是conf、logs、temp、webapps和work的父目录
#ps: 所以我们要运行多个应用时,就更改catalina.base , 然后启动tomcat就可以了

#带有context的问题
如果访问不需要有context, 将jar或者war包 命名为ROOT.war, 结合前面的tomcat结构, 
linux安装一个tomcat 可以有多个webapps, 利用 catalina.base 这个系统变量来控制,
重启tomcat即可