JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器

简介:

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。

②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)

 


二、解决办法

方法一 每次传输都手动设置编码(GET方式传输数据)

传输方
String name = URLEncoder.encode("徐越","UTF-8");
String path = "
http://localhost:8008/xyWeb/xyServlet?name=" + name;

接收方
String name = new String(request.getParameter("name").getBytes("ISO8859-1","UTF-8"));

若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。

 

方法二(过滤器)

 
  1. /**  
  2.  * 编码过滤器  
  3.  *   
  4.  * @author 徐越  
  5.  *   
  6.  */ 
  7. public class EncodingFilter implements Filter  
  8. {  
  9.     private String encoding;  
  10.  
  11.     public void init(FilterConfig fConfig) throws ServletException  
  12.     {  
  13.         encoding = fConfig.getInitParameter("encoding");  
  14.     }  
  15.  
  16.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception  
  17.     {  
  18.         HttpServletRequest httprequest = (HttpServletRequest) request;  
  19.         if ("GET".equals(httprequest.getMethod()))  
  20.         {  
  21.             // 将httpRequest进行包装  
  22.             EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding);   
  23.             chain.doFilter(wrapper, response);  
  24.         }  
  25.         else 
  26.         {  
  27.             request.setCharacterEncoding(encoding);  
  28.             response.setContentType("text/html;charset=" + encoding);  
  29.             chain.doFilter(request, response);  
  30.         }  
  31.     }  
  32.  
  33.     public void destroy()  
  34.     {  
  35.  
  36.     }  
  37.  
  38. }  
  39.  
  40.  
  41. /**  
  42.  * httpRequest进行包装类  
  43.  *   
  44.  * @author 徐越  
  45.  *   
  46.  */ 
  47. public class EncodingHttpServletRequest extends HttpServletRequestWrapper  
  48. {  
  49.     private HttpServletRequest request;  
  50.     private String encoding;  
  51.  
  52.     public EncodingHttpServletRequest(HttpServletRequest request)  
  53.     {  
  54.         super(request);  
  55.         this.request = request;  
  56.     }  
  57.  
  58.     public EncodingHttpServletRequest(HttpServletRequest request,String encoding)  
  59.     {  
  60.         super(request);  
  61.         this.request = request;  
  62.         this.encoding = encoding;  
  63.           
  64.     }  
  65.     @Override 
  66.     public String getParameter(String name)  
  67.     {  
  68.         String value = request.getParameter(name);  
  69.         if (null != value)  
  70.         {  
  71.             try 
  72.             {  
  73.                 // tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串  
  74.                 value = new String(value.getBytes("ISO8859-1"), encoding);  
  75.             }  
  76.             catch (UnsupportedEncodingException e)  
  77.             {  
  78.                 e.printStackTrace();  
  79.             }  
  80.         }  
  81.         return value;  
  82.     }  
  83.  
 
  1. <filter> 
  2.   <display-name>EncodingFilter</display-name> 
  3.   <filter-name>EncodingFilter</filter-name> 
  4.   <filter-class>cn.xy.filter.EncodingFilter</filter-class> 
  5.   <init-param> 
  6.     <description></description> 
  7.     <param-name>encoding</param-name> 
  8.     <param-value>UTF-8</param-value> 
  9.   </init-param> 
  10. </filter> 
  11. <filter-mapping> 
  12.   <filter-name>EncodingFilter</filter-name> 
  13.   <url-pattern>/*</url-pattern> 
  14. </filter-mapping> 
本文转自 IT徐胖子的专栏博客51CTO博客,原文链接http://blog.51cto.com/woshixy/1089295如需转载请自行联系原作者

woshixuye111
相关文章
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
Java 应用服务中间件 Maven
JavaWeb基础5——HTTP,Tomcat&Servlet
JavaWeb技术栈、HTTP、get和post区别、响应状态码、请求响应格数据式、IDEA使用Tomcat、报错解决、Servlet的体系结构、IDEA使用模板创建Servlet
JavaWeb基础5——HTTP,Tomcat&Servlet
|
存储 前端开发 Java
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
该文章展示了如何使用Servlet过滤器(Filter)通过注解方式创建一个网站访问人数统计功能,通过`@WebFilter`注解定义过滤器及其URL模式,并在`doFilter`方法中实现计数逻辑,将访问次数存储在`ServletContext`中,最后在JSP页面展示访问人数。
servlet过滤器--使用过滤器统计网站访问人数的计数(注解形式)
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
1691 0
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
165 0
|
存储 安全 JavaScript
JavaWeb之Servlet(下)
本文主要介绍了JavaWeb开发中关于请求、响应、会话和Servlet3.0注解的相关知识。首先讲解了请求(Request)的常用方法,以及处理请求乱码问题的几种方式。接着讨论了响应(Response)的方法,,以及设置全局初始化参数。然后介绍了会话(Session)的概念,包括其生命周期、如何设置和获取初始化参数,并对比了全局初始化参数和Servlet3.0的`@WebServlet`注解。文中给出了具体的代码示例和测试结果,帮助读者更好地理解和掌握这些概念。
|
Java 应用服务中间件 程序员
JavaWeb之Servlet(上)
本篇博文介绍了JavaWeb中Servlet的基本概念和应用。Servlet是用于交互式浏览和修改数据、生成动态Web内容的Java程序,通常运行在支持Java的应用服务器上。文章讲解了Servlet的工作模式,包括客户端请求、服务器调用Servlet以及响应返回客户端的过程。此外,还提到了Servlet API,特别是doGet和doPost方法用于处理请求和响应。作者通过创建第一个Servlet的步骤,展示了如何实现Servlet接口并配置web.xml文件。最后,文章简述了Servlet的工作原理和生命周期,强调了Servlet的单例特性以及初始化、服务和销毁的过程。
|
SQL druid Java
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
155 0
|
SQL 数据可视化 数据库
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
185 0
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
217 3