关于HTTP协议传输数据时出现中文乱码的问题(未解决)

接了个小项目,是一个winform的小项目,把界面人工输入的数据通过http协议的形式传输到服务器上,在做的过程中碰到了中文乱码的问题,我自己做了一个模拟的服务器,GlassFish Server 4.1做web服务器,用了jodd自带的madvoc框架,自己写了一下接受数据的代码,但发现了3个问题:
1、通过madvoc反射的一个action是不会出现中文乱码的问题的,传递的数据通过参数的形式传递,客户端的代码如下

//参数http传输数据(反射)
        private void button11_Click(object sender, EventArgs e)
        {
            Dictionary<String, String> param = new Dictionary<String, String>();
            param.Add("data", textBox1.Text);
            string data = HttpUitls.GET("http://localhost:8080/part3/test11", param);
            //MessageBox.Show(data);
        }
//url为请求的网址,param参数为需要查询的条件(服务端接收的参数,没有则为null)
        //返回该次请求的响应
        public static string GET(string url, Dictionary<String, String> param)
        {
            if (param != null) //有参数的情况下,拼接url
            {
                url = url + "?";
                foreach (var item in param)
                {
                    url = url + item.Key + "=" + item.Value + "&";
                }
                url = url.Substring(0, url.Length - 1);
            }
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;//创建请求
            request.Method = "GET"; //请求方法为GET
            HttpWebResponse res; //定义返回的response
            try
            {
                res = (HttpWebResponse)request.GetResponse(); //此处发送了请求并获得响应
            }
            catch (WebException ex)
            {
                res = (HttpWebResponse)ex.Response;
            }
            StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8);
            string content = sr.ReadToEnd(); //响应转化为String字符串
            return content;
        }

服务器的代码如下

/**
     * 测试
     *
     * @return
     */
    @JsonAction(value = "/part3/test11")
    public Resp test11(@In String data){
        System.out.println(data);
        return Resp.ok(data);
    }

测试结果如下
在这里插入图片描述
2、在服务器的MadvocServletFilter里进行拦截url,再通过request.getParameter(“data”)方法获取http协议传输的数据,发现出现中文乱码的问题,字母和数字传输正常。
客户端代码如下

//参数http传输数据
        private void button1_Click(object sender, EventArgs e)
        {
            Dictionary<String, String> param = new Dictionary<String, String>();
            param.Add("data",textBox1.Text);
            string data = HttpUitls.GET("http://localhost:8080/part3/test22",param);
            //MessageBox.Show(data);
        }
        //url为请求的网址,param参数为需要查询的条件(服务端接收的参数,没有则为null)
        //返回该次请求的响应
        public static string GET(string url, Dictionary<String, String> param)
        {
            if (param != null) //有参数的情况下,拼接url
            {
                url = url + "?";
                foreach (var item in param)
                {
                    url = url + item.Key + "=" + item.Value + "&";
                }
                url = url.Substring(0, url.Length - 1);
            }
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;//创建请求
            request.Method = "GET"; //请求方法为GET
            HttpWebResponse res; //定义返回的response
            try
            {
                res = (HttpWebResponse)request.GetResponse(); //此处发送了请求并获得响应
            }
            catch (WebException ex)
            {
                res = (HttpWebResponse)ex.Response;
            }
            StreamReader sr = new StreamReader(res.GetResponseStream(), Encoding.UTF8);
            string content = sr.ReadToEnd(); //响应转化为String字符串
            return content;
        }

服务器代码如下

 @Override
    @ReadWriteTransaction
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException{
        //开始执行时间
        long start = System.currentTimeMillis();
        
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        
        //以"/"开头的地址,不包括query字符串
        String url = request.getServletPath();
        
        if("/part3/test22".equals(url))
        {
            String sb=request.getParameter("data");
            System.out.println(sb);
        }

测试结果如下
在这里插入图片描述
3、客户端通过将数据写入body的形式进行http传输,在服务器的MadvocServletFilter里进行拦截url,再通过request.getReader()方法获取http协议传输的数据,发现出现中文乱码的问题,字母和数字传输正常。
客户端代码如下

//body http传输数据
        private void button2_Click(object sender, EventArgs e)
        {
            string data = HttpUitls.Post("http://localhost:8080/part3/test33",textBox1.Text,"");
            //MessageBox.Show(data);
        }
        public static string Post(string Url, string Data, string Referer)
        {
            Encoding myEncoding = Encoding.GetEncoding("gb2312");  //确定中文编码方式。此处用gb2312

            //string param =   HttpUtility.UrlEncode("参数一", myEncoding) +   "=" + HttpUtility.UrlEncode("值一", myEncoding) +   "&" +     HttpUtility.UrlEncode("参数二", myEncoding) +  "=" + HttpUtility.UrlEncode("值二", myEncoding); 

            byte[] postBytes = Encoding.ASCII.GetBytes(Data);     //将参数转化为assic码

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(Url);

            req.Method = "POST";

            req.ContentType = "application/x-www-form-urlencoded;charset=gb2312";

            req.ContentLength = postBytes.Length;

            using (Stream reqStream = req.GetRequestStream())
            {

                reqStream.Write(postBytes, 0, postBytes.Length);

            }
            string retString1;
            using (WebResponse wr = req.GetResponse())
            {

                StreamReader myStreamReader1 = new StreamReader(wr.GetResponseStream(), Encoding.UTF8);
                retString1 = myStreamReader1.ReadToEnd();

            }
            return retString1;

        }

服务器代码如下

@Override
    @ReadWriteTransaction
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException{
        //开始执行时间
        long start = System.currentTimeMillis();
        
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        
        //以"/"开头的地址,不包括query字符串
        String url = request.getServletPath();
        
        if("/part3/test22".equals(url))
        {
            String sb=request.getParameter("data");
            System.out.println(sb);
        }
        
        if("/part3/test33".equals(url))
        {
            
            BufferedReader br = null;
            StringBuilder sb = new StringBuilder("");
            String str="";
            try
            {
                br = request.getReader();

                while ((str = br.readLine()) != null)
                {
                    str = URLDecoder.decode(str, Encode_UTF8);
                    sb.append(str);
                }
                br.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (null != br)
                {
                    br.close();
                }
            }
            System.out.println(sb);
            response.sendRedirect("/part3/test1");
        }

测试结果如下
在这里插入图片描述

个人感觉madvoc应该在反射的过程中做了中文乱码的处理,但是具体代码写在哪里因为水平有限找不到,希望大神可以指点一下小弟,感激不尽!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值