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
相关文章
|
2月前
|
Java 应用服务中间件 程序员
如何利用Idea创建一个Servlet项目(新手向)(下)
如何利用Idea创建一个Servlet项目(新手向)(下)
58 0
|
2月前
|
Java 应用服务中间件 API
如何利用Idea创建一个Servlet项目(新手向)(上)
如何利用Idea创建一个Servlet项目(新手向)
151 0
|
21天前
|
Java 应用服务中间件 Maven
IDEA创建一个Servlet项目(tomcat10)
IDEA创建一个Servlet项目(tomcat10)
28 1
|
27天前
|
SQL druid Java
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
javaweb案例实训之基于jsp和servlet的用户管理开发[增删改查及登录注销]
17 0
|
27天前
|
SQL 数据可视化 数据库
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
基于jsp+servlet的javaweb实现最基本的用户注册登陆注销功能
12 0
|
2月前
|
存储 安全 JavaScript
JavaWeb之Servlet(下)
本文主要介绍了JavaWeb开发中关于请求、响应、会话和Servlet3.0注解的相关知识。首先讲解了请求(Request)的常用方法,以及处理请求乱码问题的几种方式。接着讨论了响应(Response)的方法,,以及设置全局初始化参数。然后介绍了会话(Session)的概念,包括其生命周期、如何设置和获取初始化参数,并对比了全局初始化参数和Servlet3.0的`@WebServlet`注解。文中给出了具体的代码示例和测试结果,帮助读者更好地理解和掌握这些概念。
|
2月前
|
Java 应用服务中间件 程序员
JavaWeb之Servlet(上)
本篇博文介绍了JavaWeb中Servlet的基本概念和应用。Servlet是用于交互式浏览和修改数据、生成动态Web内容的Java程序,通常运行在支持Java的应用服务器上。文章讲解了Servlet的工作模式,包括客户端请求、服务器调用Servlet以及响应返回客户端的过程。此外,还提到了Servlet API,特别是doGet和doPost方法用于处理请求和响应。作者通过创建第一个Servlet的步骤,展示了如何实现Servlet接口并配置web.xml文件。最后,文章简述了Servlet的工作原理和生命周期,强调了Servlet的单例特性以及初始化、服务和销毁的过程。
|
2月前
|
Java
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
springboot项目出现Exception in thread “main“ java.lang.NoClassDefFoundError: javax/servlet/Filter
52 0
|
24天前
|
自然语言处理 前端开发 Java
Servlet与JSP:Java Web开发的基石技术详解
【6月更文挑战第23天】Java Web的Servlet与JSP是动态网页的核心。Servlet是服务器端的Java应用,处理HTTP请求并响应;JSP则是结合HTML与Java代码的页面,用于动态内容生成。Servlet通过生命周期方法如`init()`、`service()`和`destroy()`工作,而JSP在执行时编译成Servlet。两者在MVC架构中分工,Servlet处理逻辑,JSP展示数据。尽管有Spring MVC等框架,Servlet和JSP仍是理解Web开发基础的关键。
|
24天前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。