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

常见的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(): package filters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; public class TomcatFormFilter implements Filter{ /** *Request.java *对HttpServletRequestWrapper进行扩充,不影响原来的功能并能提供所有的HttpServletRequest *接口中的功能.它可以统一的对Tomcat默认设置下的中文问题进行解决而只需要用新的Request对象替换页面中的 *request对象即可. */ class Request extends HttpServletRequestWrapper { public Request(HttpServletRequestrequest){ super (request); } /** *转换由表单读取的数据的内码. *从ISO字符转到GBK. */ public StringtoChi(Stringinput){ try { byte []bytes=input.getBytes( "ISO8859-1" ); return new String(bytes, "GBK" ); } catch (Exceptionex){ } return null ; } /** *ReturntheHttpServletRequestholdedbythisobject. */ private HttpServletRequestgetHttpServletRequest() { return (HttpServletRequest) super .getRequest(); } /** *读取参数--修正了中文问题. */ public StringgetParameter(Stringname) { return toChi(getHttpServletRequest().getParameter(name)); } /** *读取参数列表-修正了中文问题. */ public String[]getParameterValues(Stringname) { Stringvalues[]=getHttpServletRequest().getParameterValues(name); if (values!= null ){ for ( int i= 0 ;i<values.length;i++){ values[i]=toChi(values[i]); } } return values; } } public void destroy(){ } public void doFilter(ServletRequestrequest,ServletResponseresponse, FilterChainchain) throws IOException,ServletException{ HttpServletRequesthttpreq=(HttpServletRequest)request; if (httpreq.getMethod().equals( "POST" )){ request.setCharacterEncoding( "GBK" ); } else { request= new Request(httpreq); } chain.doFilter(request,response); } public void init(FilterConfigfilterConfig) throws ServletException{ } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值