------------恢复内容开始------------
1、URL传中文参数为什么会出现乱码?
Http请求传输时将url以ISO-8859-1编码,服务器收到字节流后默认会以ISO-8859-1编码来解码成字符流(造成中文乱码)。
2、解决办法:
方式一:通过转码的方式处理乱码。
我们需要把request.getParameter(“参数名”)获取到的字符串先用ISO-8859-1编码成字节流,然后再将其用utf-8解码成字符流。
- 代码示例:
- 发送请求:
package com.asd.modules.controller; import com.asd.common.constant.SysInfo; import com.asd.modules.pojo.menu.vo.MenuAndUserInfoVo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import java.util.ResourceBundle; /** * @author zs * @date 2019/12/2 15:53 * 跳转到其他系统的接口 */ @Controller @RequestMapping("/otherSystems") public class OtherSystemsController { /** * 跳转至精算手续费预估系统 * @return */ @RequestMapping("eacs") public ModelAndView eacs(){ //精算手续费预估系统地址 ResourceBundle interfaceAddress = ResourceBundle.getBundle("interfaceAddress"); String eacs = interfaceAddress.getString("eacs"); //获取系统信息 MenuAndUserInfoVo sysInfo = SysInfo.getSysInfo(); //岗位信息 String gradeName = sysInfo.getGradecname(); String gradeId = ""; if(sysInfo.getGradecname().indexOf("人保再准备金管理岗") != -1){ gradeId = "1";//审核权限 }else if (sysInfo.getGradecname().indexOf("人保再准备金精算岗") != -1){ gradeId = "2";//确认权限 } else { gradeId = "0";//无权限信息 } ModelAndView mv = new ModelAndView("redirect:" + eacs); //mv.addObject("gradeId", "人保再准备金管理岗".equals(sysInfo.getGradecname())?1:2); mv.addObject("gradeId", gradeId); mv.addObject("comCode", sysInfo.getComcode()); mv.addObject("userCode", sysInfo.getUsercode()); mv.addObject("userName", sysInfo.getUsercname()); return mv; } }
- 接收请求:
package com.asd.reserve.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; /** * @author zs * @date 2019/3/14 9:12 * 接收请求端的信息 */ @Controller @RequestMapping("/assessTriangle") public class AssessTriangleController { @RequestMapping(value ="eacs") public String alipayforward4(HttpServletRequest request) throws Exception { String characterEncoding = request.getCharacterEncoding(); String referer = request.getHeader("Referer"); String gradeid = request.getParameter("gradeid"); String comcode = request.getParameter("comcode"); String userCode = request.getParameter("userCode"); String userName = new String(request.getParameter("userName").getBytes("iso-8859-1"),"UTF-8"); return "basicData/assessBasicData"; } }
如上所示,接收到的userName为中文,需要对乱码进行处理。
方式二:通过Tomcat配置文件,设置URL编码集(URIEncoding)设置编码,这种方法也是一劳永逸的,修改Tomcat/conf 目录下 server.xml。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>
说明:标黄部分是对编码的设置。
下面来解释一下这两个属性的意义:
useBodyEncodingForURI参数表示是否用request.setCharacterEncoding参数对URL提交的数据和表单中GET方式提交的数据进行重新编码,在默认情况下,该参数为false。
URIEncoding参数指定对所有GET方式请求进行统一的重新编码(解码)的编码方式。
URIEncoding和useBodyEncodingForURI区别:
URIEncoding是对所有GET方式的请求的数据进行统一的重新编码,而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码,不同页面可以有不同的重新编码的编码方式。