java开发中前台到后台中文乱码的解决方式
2017-02-06 23:13
656 查看
在javaweb中,经常会遇到由jsp向后台提交参数,如果参数中有中文的话,不管后台用的servlet、struts2、或者springmvc,都会存在出现乱码的情况。我总结了三种解决这种问题的方法。
一:
在后台拿到值后对值进行重新编码,比如向后台传递的参数title是中文
在后台接收此参数:
转码:
二:
javascript的urlencode()函数可把字符串作为 URI 进行编码(不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) ),把非英文字符转化为英文编码
后台再用java.net.URLDecoder.decode()函数进行解码
但是以上两中方法,每次都要进行重新编码,解码,会很麻烦,下面介绍第三种方法
三:
使用拦截器(拦截器的原理不做过多赘述),代码如下:
也许很多盆友觉得这就万事大捷了,no,no,no.
有心的盆友可能会发现,如果是get方式提交请求,拦截器会不起作用,为什呢?因为post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value¶me2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用,所以上面的拦截器还需要强化一下。
我们对请求类型做一个判断,如果是get请求,我们需要通过重写httpServletRequest包装接口HttpServletRequestWrapper ,来修改url中的参数
public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {
private String charset = "UTF-8"; //初始化charset
public GetHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
public GetHttpServletRequestWrapper(HttpServletRequest request,String charset) {
super(request);
this.charset = charset;
}
/**
* 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换
*/
public String getParameter(String name) {
String value = super.getParameter(name);
value = value == null ? null : convert(value);
return value;
}
public String convert(String target) {
System.out.println("编码转换之前:" + target);
try {
return new String(target.trim().getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
return target;
}
}
这样一个套比较完整的解决中文乱码的思路就出来了,也欢迎大家补充!
一:
在后台拿到值后对值进行重新编码,比如向后台传递的参数title是中文
在后台接收此参数:
String title=request.getParameter("title");
转码:
String titlenew=new String(title.trim().getBytes("ISO-8859-1"), "UTF-8");
二:
javascript的urlencode()函数可把字符串作为 URI 进行编码(不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) ),把非英文字符转化为英文编码
urlschool = appPath+"/recruit/recruit_viewInfoList.do?page="+page+"&rows=8&abstr=0"+"&categoryId=40941992905003505418"+"&title="+positionschool;
$.getJSON(encodeURI(urlschool),function(data){ // }
后台再用java.net.URLDecoder.decode()函数进行解码
conferenceSign.setParticipants_name(java.net.URLDecoder.decode(title,"UTF-8"));
但是以上两中方法,每次都要进行重新编码,解码,会很麻烦,下面介绍第三种方法
三:
使用拦截器(拦截器的原理不做过多赘述),代码如下:
public class SetCharactorEncoding implements Filter{ String encoding=null; @Override public void destroy() { encoding=null; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(encoding!=null){ //判断字符编码是否为空 request.setCharacterEncoding(encoding); //设置request的编码格式 response.setContentType("text/html;charset="+encoding); //设置response的字符编码 HttpServletRequest req = (HttpServletRequest)request; chain.doFilter(req, response); //传递给下一个过滤器 } } @Override public void init(FilterConfig filterConfig) throws ServletException { encoding=filterConfig.getInitParameter("encoding"); //获取初始化参数 }
也许很多盆友觉得这就万事大捷了,no,no,no.
有心的盆友可能会发现,如果是get方式提交请求,拦截器会不起作用,为什呢?因为post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value¶me2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用,所以上面的拦截器还需要强化一下。
public class SetCharactorEncoding implements Filter{ String encoding=null; @Override public void destroy() { encoding=null; } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(encoding!=null){ //判断字符编码是否为空 request.setCharacterEncoding(encoding); //设置request的编码格式 response.setContentType("text/html;charset="+encoding); //设置response的字符编码 HttpServletRequest req = (HttpServletRequest)request; if(req.getMethod().equalsIgnoreCase("get")){ //如果是get请求还要进一步过滤 req=new GetHttpServletRequestWrapper(req,encoding); } chain.doFilter(req, response); //传递给下一个过滤器 } } @Override public void init(FilterConfig filterConfig) throws ServletException { encoding=filterConfig.getInitParameter("encoding"); //获取初始化参数 }
我们对请求类型做一个判断,如果是get请求,我们需要通过重写httpServletRequest包装接口HttpServletRequestWrapper ,来修改url中的参数
public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {
private String charset = "UTF-8"; //初始化charset
public GetHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
public GetHttpServletRequestWrapper(HttpServletRequest request,String charset) {
super(request);
this.charset = charset;
}
/**
* 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换
*/
public String getParameter(String name) {
String value = super.getParameter(name);
value = value == null ? null : convert(value);
return value;
}
public String convert(String target) {
System.out.println("编码转换之前:" + target);
try {
return new String(target.trim().getBytes("ISO-8859-1"), charset);
} catch (UnsupportedEncodingException e) {
return target;
}
}
这样一个套比较完整的解决中文乱码的思路就出来了,也欢迎大家补充!
相关文章推荐
- java前台向后台传值中文乱码问题解决
- Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)
- Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)
- 解决javaWEB开发过程中后台接受前台的中文信息乱码的问题
- java开发过程中从前台传到后台中文乱码《filter》
- java后台传递json到前台 中文乱码解决方法
- Java后台使用get方式远程跨域请求,返回数据为中文乱码解决方法
- 【技术贴】servlet传参|前台传参含中文符号等 tomcat乱码 java后台接收乱码终极解决方
- 【技术贴】servlet传参|前台传参含中文符号等 tomcat乱码 java后台接收乱码终极解决方
- java前台向后台传值中文乱码问题解决
- Java 前台后台数据传递、中文乱码解决方法
- 4种方法解决后台接受前台中文信息乱码的问题
- URL 中文传参,JAVA后台 request.getParameterMap()乱码的解决办法
- java后台传数据到前台乱码问题 中文转成Unicode码
- Extjs前台传值到后台出现中文乱码,解决
- ajax post 提交中文java后台获取参数出现乱码解决方法
- Java WEB开发中的中文乱码问题解决之终极之道
- js传中文给java后台,乱码问题解决
- 关于struts2.1.6前台传递中文参数到后台action出现乱码问题的解决办法
- 解决后台接受前台中文信息乱码的问题