Tomcat5/6 GBK编码下完美解决中文表单问题的过滤器

本文介绍了一个无需修改Tomcat配置文件的过滤器,用于解决Tomcat5中表单编码提交中文乱码的问题。通过提供测试页面和过滤器配置,实现了GET和POST方式下的中文数据正确读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的Tomcat5表单编码提交后乱码的解决方案有很多,有改TomcatConnector属性的,有加过滤器的.但是Tomcat自带的那个过滤器只解决了POST方式的乱码却不能处理GET方式的乱码.在这里那我就给出一个不需要修改任何Tomcat配置文件的完美解决中文问题的过滤器的代码: 首先是我们的测试页面: GET方式: POST方式: index.jsp <%@pagelanguage="java"import="java.util.*"pageEncoding="GBK"%> <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"> <html> <head> <title>表单测试页面</title> </head> <body> <formaction="action.jsp"> GET方式:<inputtype=textname="name"value="GET中文"> <inputtype=submit> </form> <formaction="action.jsp"method="POST"> POST方式:<inputtype=textname="name"value="POST中文"> <inputtype=submit> </form> </body> </html> 和普通的表单没有任何区别. 然后就是表单提交页面action.jsp: <%@pagelanguage="java"pageEncoding="GBK"%> <html> <body> 参数:<%=request.getParameter("name")%><br> </body> </html> 接着是过滤器的配置文件web.xml(用2.5版本也可以): <?xmlversion="1.0"encoding="UTF-8"?> <web-appversion="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <filter> <filter-name>TomcatFormFilter</filter-name> <filter-class>filters.TomcatFormFilter</filter-class> </filter> <filter-mapping> <filter-name>TomcatFormFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 最后最关键的就是我们的过滤器代码了,对GET方式使用请求包装器,而POST方式则用setCharacterEncoding(): packagefilters; importjava.io.IOException; importjavax.servlet.Filter; importjavax.servlet.FilterChain; importjavax.servlet.FilterConfig; importjavax.servlet.ServletException; importjavax.servlet.ServletRequest; importjavax.servlet.ServletResponse; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletRequestWrapper; importjavax.servlet.http.HttpServletResponse; publicclassTomcatFormFilterimplementsFilter{ /** *Request.java *对HttpServletRequestWrapper进行扩充,不影响原来的功能并能提供所有的HttpServletRequest *接口中的功能.它可以统一的对Tomcat默认设置下的中文问题进行解决而只需要用新的Request对象替换页面中的 *request对象即可. */ classRequestextendsHttpServletRequestWrapper { publicRequest(HttpServletRequestrequest){ super(request); } /** *转换由表单读取的数据的内码. *从ISO字符转到GBK. */ publicStringtoChi(Stringinput){ try{ byte[]bytes=input.getBytes("ISO8859-1"); returnnewString(bytes,"GBK"); } catch(Exceptionex){ } returnnull; } /** *ReturntheHttpServletRequestholdedbythisobject. */ privateHttpServletRequestgetHttpServletRequest() { return(HttpServletRequest)super.getRequest(); } /** *读取参数--修正了中文问题. */ publicStringgetParameter(Stringname) { returntoChi(getHttpServletRequest().getParameter(name)); } /** *读取参数列表-修正了中文问题. */ publicString[]getParameterValues(Stringname) { Stringvalues[]=getHttpServletRequest().getParameterValues(name); if(values!=null){ for(inti=0;i<values.length;i++){ values[i]=toChi(values[i]); } } returnvalues; } } publicvoiddestroy(){ } publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain)throwsIOException,ServletException{ HttpServletRequesthttpreq=(HttpServletRequest)request; if(httpreq.getMethod().equals("POST")){ request.setCharacterEncoding("GBK"); }else{ request=newRequest(httpreq); } chain.doFilter(request,response); } publicvoidinit(FilterConfigfilterConfig)throwsServletException{ } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值