`
lwfshr
  • 浏览: 150437 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

java web中文乱码问题

阅读更多

应用一:解决tomcat下中文乱码问题(先来个简单的) 

tomcat下,我们通常这样来解决中文乱码问题:

 

过滤器代码:

Java代码 复制代码

 

package filter;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import wrapper.GetHttpServletRequestWrapper;

public class ContentTypeFilter implements Filter {

	private String charset = "UTF-8";
	private FilterConfig config;
	
	public void destroy() {
        System.out.println(config.getFilterName()+"被销毁");
		charset = null;
		config = null;
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
        //设置请求响应字符编码
		request.setCharacterEncoding(charset);
		response.setCharacterEncoding(charset);
		
        HttpServletRequest req = (HttpServletRequest)request;
		
		
		System.out.println("----请求被"+config.getFilterName()+"过滤");
		//执行下一个过滤器(如果有的话,否则执行目标servlet)
		chain.doFilter(req, response);
		
		System.out.println("----响应被"+config.getFilterName()+"过滤");

	}

	public void init(FilterConfig config) throws ServletException {
		    this.config = config;
            String charset = config.getServletContext().getInitParameter("charset");  
            if( charset != null && charset.trim().length() != 0)
            {
            	this.charset = charset;
            }
	}

}

 

 

web.xml中过滤器配置:

Xml代码 复制代码
  1. <!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->  
  2.     <context-param>  
  3.             <param-name>charset</param-name>  
  4.             <param-value>UTF-8</param-value>  
  5.     </context-param>  
  6.   
  7.     <filter>  
  8.         <filter-name>ContentTypeFilter</filter-name>  
  9.         <filter-class>filter.ContentTypeFilter</filter-class>  
  10.     </filter>  
  11.   
  12.     <filter-mapping>  
  13.         <filter-name>ContentTypeFilter</filter-name>  
  14.         <url-pattern>/*</url-pattern>  
  15.     </filter-mapping>  
<!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->
	<context-param>
			<param-name>charset</param-name>
			<param-value>UTF-8</param-value>
	</context-param>

	<filter>
		<filter-name>ContentTypeFilter</filter-name>
		<filter-class>filter.ContentTypeFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>ContentTypeFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

 

request.setCharacterEncoding(charset); 必须写在第一次使用request.getParameter()之前,这样才能保证参数是按照已经设置的字符编码来获取。
response.setCharacterEncoding(charset);必须写在PrintWriter out = request.getWriter()之前,这样才能保证out按照已经设置的字符编码来进行字符输出。

 

通过过滤器,我们可以保证在Servlet或JSP执行之前就设置好了请求和响应的字符编码。

 

但是这样并不能完全解决中文乱码问题:

对于post请求,无论是“获取参数环节”还是“输出环节"都是没问题的;

对于get请求,"输出环节"没有问题,但是"获取参数环节"依然出现中文乱码,所以在输出时直接将乱码输出了。

 

原因是post请求和get请求存放参数位置是不同的:

post方式参数存放在请求数据包的消息体中。get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用,我们通常通过下面的代码来完成编码转换:

 

Java代码 复制代码
  1. String paramValue = request.getParameter("paramName");   
  2. paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);  
String paramValue = request.getParameter("paramName");
paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);

 

但是每次进行这样的转换实在是很麻烦,有没有统一的解决方案呢?

 

解决方案1: 在tomcat_home\conf\server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码

 

Java代码 复制代码
  1. <Connector port="8080" protocol="HTTP/1.1"    
  2.            connectionTimeout="20000"    
  3.            redirectPort="8443"    
  4.            URIEncoding="UTF-8"  
  5.  />  
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" 
               URIEncoding="UTF-8"
     />

 

这样做的缺点是,同一个tomcat下的其他应用也将受到影响。而其每次部署时都需要类修改配置也很麻烦。

 

解决方案2:自定义请求包装器包装请求,将字符编码转换的工作添加到getParameter()方法中

 

Java代码 复制代码
  1. package wrapper;   
  2.   
  3. import java.io.UnsupportedEncodingException;   
  4. import java.net.URLDecoder;   
  5.   
  6. import javax.servlet.http.HttpServletRequest;   
  7. import javax.servlet.http.HttpServletRequestWrapper;   
  8.   
  9. public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {   
  10.   
  11.     private String charset = "UTF-8";   
  12.   
  13.     public GetHttpServletRequestWrapper(HttpServletRequest request) {   
  14.         super(request);   
  15.     }   
  16.   
  17.     /**  
  18.      * 获得被装饰对象的引用和采用的字符编码  
  19.      * @param request  
  20.      * @param charset  
  21.      */  
  22.     public GetHttpServletRequestWrapper(HttpServletRequest request,   
  23.             String charset) {   
  24.         super(request);   
  25.         this.charset = charset;   
  26.     }   
  27.   
  28.     /**  
  29.      * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换  
  30.      */  
  31.     public String getParameter(String name) {   
  32.         String value = super.getParameter(name);   
  33.         value = value == null ? null : convert(value);   
  34.         return value;   
  35.     }   
  36.   
  37.     public String convert(String target) {   
  38.         System.out.println("编码转换之前:" + target);   
  39.         try {   
  40.             return new String(target.trim().getBytes("ISO-8859-1"), charset);   
  41.         } catch (UnsupportedEncodingException e) {   
  42.             return target;   
  43.         }   
  44.     }   
  45.   
  46. }  
package wrapper;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {

	private String charset = "UTF-8";

	public GetHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
	}

	/**
	 * 获得被装饰对象的引用和采用的字符编码
	 * @param request
	 * @param charset
	 */
	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;
		}
	}

}

 

修改过滤器的doFilter方法 代码如下:

Java代码 复制代码
  1. public void doFilter(ServletRequest request, ServletResponse response,   
  2.             FilterChain chain) throws IOException, ServletException {   
  3.         //设置请求响应字符编码   
  4.         request.setCharacterEncoding(charset);   
  5.         response.setCharacterEncoding(charset);   
  6.         //新增加的代码           
  7.         HttpServletRequest req = (HttpServletRequest)request;   
  8.            
  9.         if(req.getMethod().equalsIgnoreCase("get"))   
  10.         {   
  11.             req = new GetHttpServletRequestWrapper(req,charset);   
  12.         }   
  13.            
  14.         System.out.println("----请求被"+config.getFilterName()+"过滤");   
  15.         //传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象   
  16.         chain.doFilter(req, response);   
  17.            
  18.         System.out.println("----响应被"+config.getFilterName()+"过滤");   
  19.   
  20.     }  
public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
        //设置请求响应字符编码
		request.setCharacterEncoding(charset);
		response.setCharacterEncoding(charset);
        //新增加的代码		
        HttpServletRequest req = (HttpServletRequest)request;
		
        if(req.getMethod().equalsIgnoreCase("get"))
        {
        	req = new GetHttpServletRequestWrapper(req,charset);
        }
		
		System.out.println("----请求被"+config.getFilterName()+"过滤");
		//传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象
		chain.doFilter(req, response);
		
		System.out.println("----响应被"+config.getFilterName()+"过滤");

	}

 

这样一来,在servlet中调用包装器的getParameters方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了。

 

分享到:
评论
1 楼 wangboak 2014-04-04  
学习了!get请求的字符编码问题,挺不好弄的!

相关推荐

    精选_JAVA Web 中文乱码问题_源码打包

    在JAVA Web开发中,中文乱码问题是一个常见的挑战,尤其对于那些处理中文输入和输出的系统。这主要涉及到字符编码的正确设置和处理。本文将深入探讨这个问题,并提供解决策略。 1. **字符编码基础** - **字符集与...

    Java关于中文乱码问题的多种解决方法

    在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...

    java中文乱码问题详解--- java中文乱码问题详解

    ### Java中文乱码问题详解 #### 一、中文问题的来源与背景 计算机技术发展初期,操作系统主要支持单字节的ASCII字符集。随着全球化进程加快和技术进步,为支持多种语言,尤其是双字节编码的语言(如中文),提出了...

    java web开发解决乱码问题

    ### Java Web 开发中解决乱码问题的全面指南 #### 一、乱码问题概述 在Java Web开发过程中,乱码问题是开发者经常会遇到的问题之一。它通常发生在处理含有中文或其他非ASCII字符的数据时。本篇文章将详细介绍在...

    java解决中文乱码问题

    Java 解决中文乱码问题 Java 中文乱码问题是中国程序员无法避免的话题。乱码的出现是由于中文和英文的编码格式不同,解码也是不一样的。如果中国的程序员不会遇到乱码,那么只有使用汉语编程。Han语编程是怎么回事...

    java中文乱码解决问题

    JAVA 中文乱码解决问题 JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的...

    java中文乱码问题解决

    Java中文乱码问题是Java开发中常见的问题,尤其是在Web开发中,乱码问题会导致页面显示混乱,影响用户体验。解决乱码问题需要了解编码的基本原理和各种编码格式的区别。 编码的原因可以总结为两点:计算机中存储...

    java中文乱码问题

    Java 中文乱码问题是一个老生常谈的问题,特别是在 Web 应用中。今天,我们将从编码角度分析 Java 编译后在控制台和 Web 等终端显示乱码问题。 一、 Java 处理字符的原理 Java 使用 UNICODE 来存储字符数据,处理...

    Java中文乱码问题研究.pdf

    Java中文乱码问题是Java Web应用程序开发中常见的问题之一。该问题的产生是由于编码不统一,导致中文字符乱码。解决该问题的方法有多种,包括设置页面编码方式、修改Web服务器编码属性、使用过滤器等。 Java语言的...

    Java Web中文乱码处理研究.pdf

    总的来说,Java Web中的中文乱码问题是一个涉及编码理论和实践的复杂问题。通过理解字符集、编码转换以及使用通用的乱码处理器,可以有效地减少乱码现象,提高开发效率。在实践中,开发者应不断积累经验,灵活应对...

    Java WEB开发中的中文乱码问题解决方法.pdf

    在Java Web开发中,中文乱码问题一直是开发人员面临的常见问题之一。中文乱码通常是由于在字符编码转换过程中,字符集不一致或设置不当所导致。为了解决这一问题,首先需要了解Java Web工程字符编码的基本理论,包括...

    Java Web开发中文乱码问题的研究与解决.pdf

    在Java Web开发中,中文乱码问题是一个常见的困扰,尤其对于使用Servlet和JSP技术的开发者来说。乱码问题的产生主要源于字符编码的不一致性,即在Web组件之间、Web组件与浏览器、以及Web组件与数据库之间的字符集...

    java获取乱码问题

    通过上述方法,可以有效地解决Java Web应用中常见的乱码问题,提高用户体验和系统的稳定性。此外,对于更复杂的多语言环境,还应该考虑采用国际化和本地化策略,以更好地支持不同地区的用户需求。

    java+jsp+mysql开发 web项目处理中文乱码问题

    处理 Java+jsp+mysql 开发 web 项目中文乱码问题 在 Java+jsp+mysql 开发 web 项目中,中文乱码问题是一个常见的问题,影响着项目的正常运行。下面我们将从四个方面来解决中文乱码问题: 一、Jsp 输出中文的乱码...

    Java web工程乱码解决方案

    这里总结了我在j2ee开发过程中,中文乱码的解决方案。希望能够帮到大家!

    JAVA 乱码问题集合

    在Java编程中,乱码问题是一个常见的困扰,尤其是在处理字符编码时。以下是一些关键的知识点,可以帮助理解和解决Java中的乱码问题。 首先,我们需要理解字符编码的基本概念。字符编码是用来表示文本的一种方式,...

    解决中文乱码问题-java

    在IT领域,尤其是在Java开发中,遇到中文乱码问题是相当常见的。这主要涉及到字符编码的处理,如果在数据传输、存储或显示过程中没有正确地指定或转换编码,就容易出现乱码现象。以下是对如何在Java中解决中文乱码...

    解决web中文乱码

    一、理解Web中文乱码问题 中文乱码通常出现在两个场景:1) 服务器接收到的请求参数出现乱码;2) 客户端接收到的响应内容显示为乱码。这主要是由于字符编码不一致导致的。HTTP协议默认使用ASCII编码,而中文字符通常...

    Java Web开发常见问题.pdf

    ### Java Web开发中常见的中文乱码问题解析 在Java Web开发过程中,中文乱码问题是开发者经常遇到的一个挑战。这些问题主要源于Java默认的Unicode编码与HTML页面及表单默认的Latin-1编码之间的不兼容,以及在不同的...

Global site tag (gtag.js) - Google Analytics