接了个小项目,是一个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应该在反射的过程中做了中文乱码的处理,但是具体代码写在哪里因为水平有限找不到,希望大神可以指点一下小弟,感激不尽!