小议Servlet接收post和get混合提交中文乱码问题
2011-09-08 22:15
591 查看
网上有很多讲解决Servlet中文乱码的问题,一般的解决方案是加一个过滤器,在doFilter方法中加入:
可是这样并不能解决GET方式传递的数据。如果你能修改tomcat的配置文件,你可以把网址的编码设为UTF-8(或其它):在server.xml的<Connector> 加入 URIEncoding="UTF-8"。当然,更大的可能性是你没有权限修改这个文件,或者有多个网站,但使用了不同的编码。所以需要在doFilter中判断是get还是post后再作相应的处理
这样看起来似乎是完美了,但是实际应用中,经常使用到混合POST和GET方式提交。如用POST方式提交一个单表到www.xxx.com/deal?page=2。如果使用上述的过滤器,自然是按POST方式进行处理,那通过网址传过来的中文数据就会乱码了。
好在可以得到QueryString,似乎只要把QueryString中的出现的参数处理一下就行了(先忽略重复name的问题):
运行下。。。OMG。。。java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap。原来这个Map是不能添加值的。可是第一个过滤器中我却成功修改了值,所以产生了第一种方案,我不用put,我去改values。
这样做蛮复杂的,效率又不高。如果post和get中有相同的name,就会出错,可以稍加修改:
另一种方案是,把parameter中的成员都放到Attribute中,然后把QueryString中的成员也放到Attribute中,覆盖了parameter中的GET方式提交的成员。缺点是,数据得用getAttribute来读了...
本文出自 “木又寸的技术博客” 博客,请务必保留此出处http://jianshusoft.blog.51cto.com/2380869/660824
request.setCharacterEncoding("UTF-8");
可是这样并不能解决GET方式传递的数据。如果你能修改tomcat的配置文件,你可以把网址的编码设为UTF-8(或其它):在server.xml的<Connector> 加入 URIEncoding="UTF-8"。当然,更大的可能性是你没有权限修改这个文件,或者有多个网站,但使用了不同的编码。所以需要在doFilter中判断是get还是post后再作相应的处理
if(httpServletRequest.getMethod().toLowerCase().equals("get")){
for(String[] strs : request.getParameterMap().values()){
for(int i = 0; i < strs.length; i++){
strs[i] = new String(strs[i].getBytes("ISO-8859-1"), "UTF-8");
System.out.println(strs[i]);
}
}
}
else{
request.setCharacterEncoding("UTF-8");}
这样看起来似乎是完美了,但是实际应用中,经常使用到混合POST和GET方式提交。如用POST方式提交一个单表到www.xxx.com/deal?page=2。如果使用上述的过滤器,自然是按POST方式进行处理,那通过网址传过来的中文数据就会乱码了。
好在可以得到QueryString,似乎只要把QueryString中的出现的参数处理一下就行了(先忽略重复name的问题):
HttpServletRequest httpServletRequest = (HttpServletRequest) request; String[] expressions = httpServletRequest.getQueryString().split("&"); for(String expression : expressions){ String[] parts = expression.split("="); if(parts.length == 2){ request.getParameterMap().put(parts[0], new String[]{ decode(parts[1])}); } }
运行下。。。OMG。。。java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap。原来这个Map是不能添加值的。可是第一个过滤器中我却成功修改了值,所以产生了第一种方案,我不用put,我去改values。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); //这句得在下面那个强制转换之前,不知道为什么。这句用来处理post的情况 HttpServletRequest httpServletRequest = (HttpServletRequest) request; //建立一个ArrayList用来存所有的Get方式提交的name对应在Parameter里的value ArrayList<String> queryValues = new ArrayList<String>(); Map<String, String[]> map = request.getParameterMap(); String query = httpServletRequest.getQueryString(); if(query != null){ String[] expressions = query.split("&"); for(String expression : expressions){ String[] parts = expression.split("="); if(parts.length == 2){ String[] values = map.get(parts[0]); for(String value : values){ queryValues.add(value); } } } } //遍历value,如果是get方式提交的(存在于queryValues中),就转一下编码 for(String[] strs : request.getParameterMap().values()){ for(int i = 0; i < strs.length; i++){ for(String qStr : queryValues){ if(qStr.equals(strs[i])){ strs[i] = new String(qStr.getBytes("ISO-8859-1"), "UTF-8"); //ISO-8859-1是tomcat中默认的,UTF-8是urlencode的编码 break; } } } } chain.doFilter(request, response); }
这样做蛮复杂的,效率又不高。如果post和get中有相同的name,就会出错,可以稍加修改:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
ArrayList<String> queryValues = new ArrayList<String>();
Map<String, String[]> map = request.getParameterMap();
String query = httpServletRequest.getQueryString();
if(query != null){
String[] expressions = query.split("&");
for(String expression : expressions){
String[] parts = expression.split("=");
if(parts.length == 2){
/*String[] values = map.get(parts[0]);
for(String value : values){
queryValues.add(value);
}*/
//将上面这段修改为
String str = URLDecoder.decode(parts[1], "UTF-8");
System.out.println(str);
queryValues.add(new String(str.getBytes("UTF-8"), "ISO-8859-1"));
}
}
}
for(String[] strs : request.getParameterMap().values()){
for(int i = 0; i < strs.length; i++){
for(String qStr : queryValues){
if(qStr.equals(strs[i])){
strs[i] = new String(qStr.getBytes("ISO-8859-1"), "UTF-8");
break;
}
}
}
}
chain.doFilter(request, response);
}
另一种方案是,把parameter中的成员都放到Attribute中,然后把QueryString中的成员也放到Attribute中,覆盖了parameter中的GET方式提交的成员。缺点是,数据得用getAttribute来读了...
本文出自 “木又寸的技术博客” 博客,请务必保留此出处http://jianshusoft.blog.51cto.com/2380869/660824
相关文章推荐
- 小议Servlet接收post和get混合提交中文乱码问题
- 解决servlet中输出中文到浏览器以及post、get两种提交方法乱码问题
- servlet修改get和post提交乱码问题
- Post 提交中文乱码问题和GET提交乱码问题
- ajax返回中文乱码,servlet中的显示乱码,post提交的乱码问题,编码大总结
- Post与Get提交使用过滤器解决中文乱码问题
- 在jsp编程中,用get提交表单提交正常,而用post方式出现中文乱码-问题
- java中form以post、get方式提交数据中文乱码问题总结
- get和post方式提交中文乱码问题解决方案
- java中form以post、get方式提交数据中文乱码问题总结
- 解决问题:在使用springmvc的web.xml配置乱码拦截器之后接收的get或者post请求中文还是乱码
- java中form以post、get方式提交数据中文乱码问题总结
- servlet接收POST提交的中文传入数据库后乱码
- java中form以post、get方式提交数据中文乱码问题总结(转)
- Servlet GET、POST请求中文乱码问题
- 解决Get和Post请求中中文乱码问题 (2013-01-26 23:59:39)转载▼ 标签: javaee it 分类: JavaEE 对于Post请求,只需在Servlet或者jsp中写入如下
- 解决Servlet中get或post中文乱码问题
- java中form以post、get方式提交数据中文乱码问题总结
- 解决post、get提交中文乱码问题
- get提交中文,post提交中文乱码问题