为什么采用filter实现了字符集的统一编码

为什么采用filter实现了字符集的统一编码

问题:

为什么会有字符集编码的问题呢?对于Java Web应用,使用Tomcat容器获取和传递的参数(request.getParameter())默认是iso8859-1编码格式,所以即使我们在页面统一使用中文编码GB2312,在request.getParameter()取得的参数仍会有乱码。

因此我们要对Tomcat获取的参数进行编码转换,采用request.setCharacterEncoding()response.setCharacterEncoding()会使得获取的参数与返回的结果和页面的(比如是GB2312)编码一致,这样就可以避免编码问题了。

但是这样的话,问题又来了,比如我们现在有很多的servletjsp,每个文件都要取得参数,这样的话每个servletjsp都要写request.setCharacterEncoding()response.setCharacterEncoding(),这样就有重复的代码,不简洁,这就需要用filter来帮忙了。

解决思路:

Filter是一层接口,横切在请求与Tomcat容器之间,它可以设置请求传递的数据编码格式或者说Tomcat取得参数与返回结果的字符编码。这样在servletjsp中就不用再写重复的代码了,由filter设置。采用Filter必须要实现javax.servlet.Filter接口,一个filter代码如下:

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; //设置统一的字符集编码控制类 public class CharsetEncodingFilter implements Filter { private String charEncode = null; public void destroy() { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding(charEncode); filterChain.doFilter(servletRequest, servletResponse); } public void init(FilterConfig filterConfig) throws ServletException { this.charEncode = filterConfig.getInitParameter("charEncode"); } }

根据API,要实现其三个方法:initdoFilterdestroy,其核心是doFilter方法。该方法将拦截到的所有请求统一设置为指定的charEncode编码,然后将请求再发送下去,这样Tomcat得到的参数都是指定的编码格式了,也就实现了简化重复.

要想使用该filter,必须要配置该filter,就像servlet一样需要配置。其配置如下(web.xml)

<!-- 用于设置字符集的filter -->

<filter> <filter-name>CharsetEncodingFilter</filter-name> <filter-class>kane.CharsetEncodingFilter</filter-class> <init-param> <param-name>charEncode</param-name> <param-value>GB2312</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping>

其配置的大致与servlet是一致的,这样的话,任何以.jsp.do结尾的请求都会被fliter拦截到,从而用指定的编码设置字符集,这样就可以实现编码简洁了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值