思路
通过过滤器在执行Servlet之前将请求重新编码,在返回客户端前重新编码,所以要分为两大类处理,一类是处理请求乱码,一类是处理响应乱码。
get请求的请求参数是在url中的,而post请求的参数在请求体里面,因此要分情况处理。
解决请求乱码
Post乱码
request.setCharacterEncoding("UTF-8")
Get乱码
增强request.getparameter方法,让它在获取参数时就实现重新编码。(装饰器模式的应用)自定义一个CharacterRequest继承HttpServletRequestWrapper,用于包装原来的 HttpServletRequest,并增强getparameter()方法。放行时将request替换为characterRequest
(也可以通过配置Tomcat来解决,当然不推荐使用)
解决响应乱码
response.setContentType(“text/html;charset=utf-8”)
总结:
public class CharacterFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//解决POST请求乱码
request.setCharacterEncoding("UTF-8");
//解决响应乱码
response.setContentType("text/html;charset=utf-8");
//解决get乱码
CharacterRequest characterRequest = new CharacterRequest(request);
filterChain.doFilter(characterRequest,response);
}
@Override
public void destroy() {
}
class CharacterRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public CharacterRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
//增强原来的方法,在里面修改编码方式
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if(value == null){
return null;
}else{
String method = request.getMethod();
if("get".equalsIgnoreCase(method)){
try{
value = new String(value.getBytes("iso-8859-1"),"utf-8") ;
}catch(UnsupportedEncodingException e){
throw new RuntimeException(e);
}
}
}
return value;
}
}
}
别忘了在web.xml中使用该过滤器!!