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

        在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&parame2=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;  
          }  
	}
         这样一个套比较完整的解决中文乱码的思路就出来了,也欢迎大家补充!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值