中文乱码

------------恢复内容开始------------

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参数对数据进行的重新编码,不同页面可以有不同的重新编码的编码方式。

posted @ 2019-12-13 09:44  慎终若始  阅读(1017)  评论(0编辑  收藏  举报