【技术贴】servlet传参|前台传参含中文符号等 tomcat乱码 java后台接收乱码终极解决方

简介: 1.前台传参,一定要编码,否则中文传不出来~~tomcat乱码此篇只适合于tomcat中文传参乱码,websphere6.1中文传参乱码请移步http://hi.baidu.com/ae6623/item/27c43f57e913a0cad2e10c46 前台如果用js进行了编码,后台用jsp或者servlet进行解码的时候就有可能乱码,如下,是我遇到的一个问题。

1.前台传参,一定要编码,否则中文传不出来~~tomcat乱码此篇只适合于tomcat中文传参乱码,websphere6.1中文传参乱码请移步http://hi.baidu.com/ae6623/item/27c43f57e913a0cad2e10c46


前台如果用js进行了编码,后台用jsp或者servlet进行解码的时候就有可能乱码,如下,是我遇到的一个问题。


我的前台js里面写:


var descMsg = encodeURIComponent($("#descMsg").val()); parm = "pdfHeadsDefine?docNo="  + docNo +"&companyCode=" + companyCode +"&descMsg=" +descMsg;location.href = (parm);


后台jsp如果解码这样写: 


String descMsg = new String(req.getParameter("descMsg").getBytes("ISO8859-1"), "UTF-8");

这样就解决了乱码。。


然后下面的是另一些情况。

Enumeration em = req.getParameterNames();        while (em != null && em.hasMoreElements()) {            String paraName = (String) em.nextElement();            String paraValue = req.getParameter(paraName);            queryString += "&" + paraName + "=" + URLEncoder.encode(paraValue, "utf-8");//编码        }            if (queryString.endsWith("&")) {            queryString = queryString.substring(0, queryString.length() - 1);        }



2.后台接收的时候,不用再次用什么decode去解码,因为getParameter的时候,servlet会自动解码一下,而我们需要做的就是空值处理(你的业务不需要这一步可以不做),和重新转码:


// 接收公司号       String companyCode = req.getParameter("companyCode");       // 接收目标公司号       String qtyCompany = req.getParameter("qty_company");       // 接收查询sql条件,不做trim()处理,防止前台可能传入带空格的查询条件       String condition = req.getParameter("con");       // 暂时未启用       String spName = req.getParameter("sp");       spName = spName == null ? "" : spName;       String spParameters = req.getParameter("sp_args");       spParameters = spParameters == null ? "" : spParameters.trim();                   // 接收sheetName,导出excel必备参数       String sheetName = req.getParameter("sheet_name");                   // 接收fileName       String fileName = req.getParameter("fileName");                   // 接收最大值       String maxNumber = req.getParameter("maxNumber");       // 转码(字符集)       companyCode = toDecode("companyCode", companyCode);       qtyCompany = toDecode("qtyCompany", qtyCompany);       condition = toDecode("condition", condition);       sheetName = toDecode("sheetName", sheetName);       maxNumber = toDecode("maxNumber", maxNumber);       fileName = toDecode("fileName", fileName);       // 处理文件名       fileName = "".equals(fileName) ? getReportNo(req) + ".xls" : fileName;       // 对 sheetName做处理,非空否则报错.       sheetName = "".equals(sheetName) ? fileName : sheetName;



转码方法:


/**    *     * toDecode:(转码). <br/>    *     * @param param    * @return String    * @since JDK 1.5    */   private String toDecode(String name, String param) {       System.out.println(name + " 转码前的值为:" + param);       param = param == null ? "" : param.trim();       try {           param = new String(param.getBytes("ISO8859_1"), "utf-8");       } catch (UnsupportedEncodingException e) {           e.printStackTrace();                   }       System.out.println(name + " 转码后的值为:" + param);       return param.trim();   }


此时你的所有中文参数都会变成正规的汉字.


3.然后还有最后一步,就是下载文件的时候,记得修改报文信息.


//在线预览 resp.setHeader("Content-Disposition", "inline;filename=" + new String((reportName).getBytes("gb2312"), "ISO8859_1"));       //直接下载resp.setHeader("Content-Disposition", "attachment;filename=" + new String((reportName).getBytes("gb2312"), "ISO8859_1"));

// 判断是在线阅读还是下载保存

                if (report.isReadOnline()) {


                    // 在线阅读

                    // resp.setHeader("Content-Disposition", "inline;filename=" + reportName);

                    // resp.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(URLEncoder.encode(reportName, "utf-8"),"utf-8"));

                    // resp.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode(reportName, "utf-8"));

                    resp.setHeader("Content-Disposition", "inline;filename=" + new String((reportName).getBytes("gb2312"), "ISO8859_1"));


                } else {

                    // 下载保存

                    // resp.setHeader("Content-Disposition", "attachment;filename=" + reportName);

                    // resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(URLEncoder.encode(reportName, "utf-8"),"utf-8"));

                    // resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(reportName, "utf-8"));

                    resp.setHeader("Content-Disposition", "attachment;filename=" + new String((reportName).getBytes("gb2312"), "ISO8859_1"));

                }


这个最后一步简直就是杀手锏!!!!! 多次都是这段代码救我于水深火热之中,久久感激不尽!!



总结:


这个故事告诉我们,前台发送中文参数,一定要记得编码,因为 浏览器发送url请求的时候不识别的中文参数,比如说,你传值,name = &pass我哈 ,你说你怎么办,传出去,指不定后台就以为name是空呢,而且多了一个pass参数,因为pass前边有&符号,明显的参数嘛,所以要编码.


后台解码,我一开始就认为百度是权威的,既然编码了,为毛不解码,我就尝试解码,但是越解越不对劲啊,更乱了,那么好吧,百度上说什么前台二次编码,后台一次解码,因为getParameter会自动解码一次,刚好2次抵消,我次奥,我信了,直接前台二次编码,后台解码,你妹啊,更乱啊!!!


绝知此事要躬行,不敢私藏于单机,遂2013年3月8日18:07:47上传到百度博客,网友共乘凉.


ps 忘记说了,对于

param = new String(param.getBytes("ISO8859_1"), "utf-8");

这里的"ISO8859_1"是可以在tomcat的C:\tomcat7\conf\server.xml里面自己设置tomcat的默认编码,设置了之后,你就把"ISO8859_1"换成你设置的GBK啊,或者UTF-8,比如我把设置成了GBK,就可以写

param = new String(param.getBytes("GBK"), "utf-8");<Connector port="8080" protocol="HTTP/1.1"           connectionTimeout="20000"           redirectPort="8443" URIEncoding="GBK" useBodyEncodingForURI="true"  />总之,各种情况不一样,大家自己分析吧,多一条路子是一条路子~~祝你转码好运~~

目录
相关文章
|
20天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
104 26
|
4月前
|
Java 关系型数据库 MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【8月更文挑战第19天】在Linux上搭建Java Web应用环境,需安装JDK 1.8、Tomcat及MariaDB。本指南详述了使用apt-get安装OpenJDK 1.8的方法,并验证其版本。接着下载与解压Tomcat至`/usr/local/`目录,并启动服务。最后,通过apt-get安装MariaDB,设置基本安全配置。完成这些步骤后,即可验证各组件的状态,为部署Java Web应用打下基础。
66 1
|
4月前
|
Java 应用服务中间件 Windows
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
|
2月前
|
IDE Java 编译器
Java“找不到符号” 错误怎么查找解决
“找不到符号”是Java编程中常见的编译错误,通常表明代码试图访问未声明或不可见的符号(如类、方法或变量)。解决此问题需检查拼写、导入包是否正确及作用域是否合适。确保使用正确的类路径和库,可有效避免此类错误。若问题依旧,查阅官方文档或使用调试工具定位错误亦为良策。
2462 10
|
3月前
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
1627 2
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
49 3
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
46 1
|
4月前
|
网络协议 Java 应用服务中间件
Tomcat源码分析 (一)----- 手撕Java Web服务器需要准备哪些工作
本文探讨了后端开发中Web服务器的重要性,特别是Tomcat框架的地位与作用。通过解析Tomcat的内部机制,文章引导读者理解其复杂性,并提出了一种实践方式——手工构建简易Web服务器,以此加深对Web服务器运作原理的认识。文章还详细介绍了HTTP协议的工作流程,包括请求与响应的具体格式,并通过Socket编程在Java中的应用实例,展示了客户端与服务器间的数据交换过程。最后,通过一个简单的Java Web服务器实现案例,说明了如何处理HTTP请求及响应,强调虽然构建基本的Web服务器相对直接,但诸如Tomcat这样的成熟框架提供了更为丰富和必要的功能。
|
4月前
|
Java
java:找不到符号
这篇文章讨论了Java编程中常见的错误信息 "找不到符号:类 entity",并提供了解决这个问题的一些方法和建议。
|
4月前
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
79 3