之所以会产生乱码问题,在我之前的博文中有过比较详细的论述,在这里就不再解释,直接上代码。
Filter
package cn.ccnu.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
public class EncodingFilter implements Filter{
private String charset;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
charset = filterConfig.getInitParameter("charset");
if(charset == null || charset.isEmpty()){
charset = "UTF-8";
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//设置Request中请求方法为post的乱码问题
request.setCharacterEncoding(charset);
//解决响应中乱码问题
resp.setCharacterEncoding(charset);
resp.setContentType("text/html;charset=" + charset);
//要解决get请求乱码问题,要重写HttpServletRequest中的getParameter方法
//所用的模式为装饰者模式
HttpServletRequest myRequest = new MyCharsetEncoding(req);
chain.doFilter(myRequest, response);
}
@Override
public void destroy() {
}
}
class MyCharsetEncoding extends HttpServletRequestWrapper{
//定义一个变量记住要增强的对象
HttpServletRequest request;
//定义一个带参的构造函数,把腰增强的对象传进来
public MyCharsetEncoding(HttpServletRequest request) {
super(request);
this.request = request;
}
//覆盖要增强的方法
@Override
public String getParameter(String name) {
try{
//通过原对象的原方法得到提交的值
String oldValue = this.getParameter(name);
//如果为空,则返回空
if(oldValue == null){
return null;
}else if(!this.request.getMethod().equalsIgnoreCase("get")){//如果不是get提交方式,直接返回
return oldValue;
}else{
//如果是get提交方式,则重新编码后返回
String newValue = new String(oldValue.getBytes("ISO-8859-1"), this.request.getCharacterEncoding());
return newValue;
}
}catch(Exception e){
throw new RuntimeException(e);
}
}
}
部署描述文件
<!-- Filter部署 -->
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.ccnu.filter.EncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>