您的位置:首页 > 编程语言 > Java开发

java开发中前台到后台中文乱码的解决方式

2017-02-06 23:13 656 查看
        在javaweb中,经常会遇到由jsp向后台提交参数,如果参数中有中文的话,不管后台用的servlet、struts2、或者springmvc,都会存在出现乱码的情况。我总结了三种解决这种问题的方法。

       一:

        在后台拿到值后对值进行重新编码,比如向后台传递的参数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;
}
}
         这样一个套比较完整的解决中文乱码的思路就出来了,也欢迎大家补充!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息