过滤器解决中文乱码的思想:
为什么get和post访问方式解决乱码的方法不一样?
过滤器拦截用户的请求访问,实现统一全站编码的功能。但是,由于请求方式post和get解决乱码方式不同,post方式的请求参数存放在消息体中,可以通过setCharacterEncoding()方法进行设置,而get方式的请求参数存放在消息头中,必须通过获取URI参数才能进行设置。
如果每次单独对get请求方式进行处理,势必会很麻烦,为此,可以通过HttpServletRequestWrapper类对HttpServletRequest进行包装,通过重写getParameter()的方式来设置get方式提交参数的编码。
代码如下:
package cn.com.test;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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 CharacterFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//拦截所有的请求,解决全站中文乱码
//制定request和response的编码
request.setCharacterEncoding("utf-8"); //这只对消息体有效,也就是只对post方式的请求参数有效,post方式的请求参数存放在消息体中
response.setContentType("text/html;charset=utf-8");
//在放行的时候应给给目标资源一个request对象,让目标资源调用getParameter时调用到我们写的getParameter
//对这获取到的request进行包装
CharacterRequest characterRequest = new CharacterRequest (request);
//这里放行的时候,携带的就是我们包装后的request → characterRequest
chain.doFilter(characterRequest, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
//这个内部类的作用就是对获取到的request对象(原生request对象)的进行包装
class CharacterRequest extends HttpServletRequestWrapper{
public CharacterRequest(HttpServletRequest request) {
super(request);
}
//子类继承父类一定会覆写一些方法,此处用于重写getParameter()方法
public String getParameter(String name) {
//调用被包装对象的getParameter()方法,获得请求参数
String value = super.getParameter(name);
if (value == null) {
return null;
}
//判断请求方式
String method = super.getMethod();
if ("get".equalsIgnoreCase(method)) {
try {
//iso-8859-1 根据具体情况确定是否是是这种编码
value = new String(value.getBytes("iso-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
//解决乱码后,返回结果
return value;
}
}
}
在web.xml文件中,配置CharacterFilter过滤器,由于要拦截用户访问资源的所有请求,因此将元素拦截的路径设置为“/*”,
代码如下:
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>cn.com.test.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
名字和类需要根据具体的过滤器进行配置