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

原创 2017年02月06日 23:13:04
        在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;  
          }  
	}
         这样一个套比较完整的解决中文乱码的思路就出来了,也欢迎大家补充!


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java中文乱码解决之道(八)-----解决URL中文乱码问题

我们主要通过两种形式提交向服务器发送请求:URL、表单。而表单形式一般都不会出现乱码问题,乱码问题主要是在URL上面。通过前面几篇博客的介绍我们知道URL向服务器发送请求编码过程实在是实在太混乱了。不...

java后台与页面进行数据交互时产生乱码

java后台与页面进行数据交互时产生乱码

页面与后台传递中文乱码问题(java乱码)

1、前台中文传递到后台乱码, 前台不需要处理, 系统一般都会默认把中文转化为ISO-8859-1类型, 只需在后台接受数据是处理 Str为前台传过来的中文字符串: String i...

解决后台传到前台的值是中文乱码的问题

直接说解决办法: 在后台这样处理        String msg = URLEncoder.encode("中文", "UTF-8").replace("+","%20") ...

前后台交互中文乱码可能原因

很多人看到的就是get会把参数发到url里面一起提交。post会把参数默默地提交到后台。那么乱码问题呢,我遇到了,收集了网上的一些观点看法,观点不完全正确,但是合到一起还是很有参考价值的 reques...

解决javaWEB中前台传数据到后台中文乱码问题的3种方法

中文乱码问题真的是一个很棘手的问题,特别是从前台传到后台之后,都不知道问题出在哪里了。现在分享解决javaWEB中前后台中文乱码问题的3种方法。 方法一: tomcat的自带编码是ISO-8859-1...

解决JAVA中前台传数据到后台中文乱码问题

中文乱码问题真的是一个很棘手的问题,特别是从前台传到后台之后,都不知道问题出在哪里了。现在分享解决javaWEB中前后台中文乱码问题的3种方法。 方法一: tomcat的自带编码是ISO-8859...

java前台向后台传值中文乱码问题解决

1:从jsp页面向后台传值 jsp:/kqbg?search"> java: String str=request.getParameter("search");             ...

Java 后台向前台传递中文乱码

在这里提供一个函数,通过这个函数来发送信息,就不会出现乱码,核心思想也是设置response流的字符集。函数代码如下: Java代码   /**   * @Function:...

java后台传递json到前台 中文乱码解决方法

查了两天 都说处理response 不过我搭建的框架里没有response(至少表面上没有) 然后拼接了一个String作为json传递到前台 但是遇到中文 前台就显示“?” 试过很多办法 都不能...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)