功能
字符编码Filter是最常用的Filter之一,常用来解决Tomcat等服务器里request、response乱码的问题。
字符编码Filter是在request提交到Servlet之前对request进行指定编码方式的编码。
代码
publicclass CharacterEncodingFilterimplements Filter { private StringcharacterEncoding;// 编码方式,配置在web.xml中 privatebooleanenabled;// 是否启用该Filter,配置在web.xml中
@Override publicvoid init(FilterConfig filterConfig)throws ServletException { this.characterEncoding = filterConfig.getInitParameter("characterEncoding") .trim(); this.enabled ="true".equalsIgnoreCase(filterConfig.getInitParameter( "enabled").trim()); }
@Override publicvoid doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) resp; HttpServletRequest request = (HttpServletRequest) req; if (enabled) { String method = request.getMethod(); if ("GET".equalsIgnoreCase(method)) { // GET方式提交 chain.doFilter(new RequestWrapper(request), response); } elseif ("POST".equalsIgnoreCase(method)) { // POST方式提交 request.setCharacterEncoding(characterEncoding); chain.doFilter(request, response); } } else { chain.doFilter(request, response); } }
privateclass RequestWrapperextends HttpServletRequestWrapper { public RequestWrapper(HttpServletRequest request) { super(request); }
@Override public String getParameter(String name) { try { returnnew String(super.getParameter(name).getBytes("iso8859-1"), characterEncoding); } catch (UnsupportedEncodingException e) { thrownew RuntimeException("不支持编码:" + characterEncoding); } } }
@Override publicvoid destroy() { } } |
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>cn.itcast.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>enabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>characterEncoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>