在一些请求中出现了乱码问题,并且简单的setCharacterEncoding() 等方法和配置web.xml底层提供的过滤器也无法解决时,我们可是使用如下代码解决
package com.kunag.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/**
* @author CH
*/
public class CharacterFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
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 destroy() {
}
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使用自定义编写的过滤器,注意修改对应的实现过滤器的路径
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>com.kunag.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>