一 背景
世纪初的老项目,使用jsp-servlet,jdk5,部署在tomcat5上。
其中有用到js模态弹窗,window.showModelessDialog(url,window,style)
其中url带有中文提示语,未进行编码处理
现迁移到jdk8,tomcat8.5.96环境
其它还好,但这个弹框内容为400,包含不符合规范的字符
二 原因(推测)
搜到tomcat高版本(7之后)增加了get请求的字符规范校验,包括括号等特殊字符,源码还能看到一堆检查。而且不止那些博客文档提到的{}|等符号,中文乱码、中文符号也会被阻断。没找到屏蔽这些校验的方式
三 尝试过的方案
1 其它文档博客提到的
tomcat/conf/server.xml? ?connect标签增加 URLEncoding="utf-8"? useBodyEncodingForURI="true" relaxedQueryChars="{}|" relaxedPathChars="{}|" 等等,分别表示请求按此编码、启用uri编码、忽略特殊字符。但实际并没效果,不知道是没包含中文乱码字符还是这配置就没用
2 tomcat/conf/catalina.propertis? 放开allow,但试着也没卵用
官方文档:Apache Tomcat 8 Configuration Reference (8.5.97) - System Properties
3 conf/web.xml 或者项目的 webapps/xxx/WEB-INF/web.xml? 里面的编码过滤器,改为utf-8
4 jsp顶头有?<%@page contentType="text/html;charset=GBK" %> ,不过好像不影响?这影像是jsp展示在浏览器时指定浏览器的编码
====================================
其中123都是为了让tomcat对请求进行一次编码,不过试下来没效果
以上怎么改都没什么用,但为gbk时全400,改成utf8好歹出现过乱码展示而不是400
======================================
四 最后解决
按三中123改完,4无所谓
然后在js jsp里找到调模态的地方,给url加上 encodeURI(url) 进行编码,接受的jsp不用改了
如果接受还是乱码,就给接受方加个解码
对于老项目改动很大,不过现在的容器这么设计了,不想改代码就改tomcat源码罢