1.
public class CharacterFilter implements Filter {
private String characterEncoding = null;
FilterConfig fc;
public void init(FilterConfig filterConfig) throws ServletException {
fc = filterConfig;
if (null != fc &&
null != fc.getInitParameter("encoding") &&
!"".equals(fc.getInitParameter("encoding"))) {
characterEncoding = fc.getInitParameter("encoding");
} else {
characterEncoding = "UTF-8";
}
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 拦截所有的请求 解决全站中文乱码
// 指定 request 和 response 的编码
request.setCharacterEncoding(characterEncoding);
//将response对象中的数据以UTF-8解码后发向浏览器
response.setCharacterEncoding(characterEncoding);
//告诉浏览器输出内容为HTML,并使用UTF-8对HTML内容进行解码
response.setContentType("text/html;charset="+characterEncoding);
chain.doFilter(request, response);
}
public void destroy() {
}
}
2.配置Filter,注意编码Filter注册要放到最前面
<filter>
<filter-name>CharacterFilter</filter-name>
<filter-class>com.hbxy.web.c04.filter.CharacterFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping
补充:关千编码问题
在Servlet中,request/response处理中文时,使用默认配置往往会出现乱码,如:
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
OutputStream out = response.getOutputStream();
String data =“张三”;
out.write(data.getBytes("UTF-8"));
}
输出乱码的问题是程序用UTF-8编码,而如果浏览器用GB2312解码,会出现乱码
Servlet乱码分为request乱码和response乱码
Response响应乱码解决办法
- 1、response.setCharacterEncoding(“UTF-8”); 用千response.getWriter()输出的字符流的乱码问题,如果是response.getOutputStream()是不需要设置(因为数据里已经进行了编码)
- 2、response.setContentType("text/html;charset=UTF-8"); 是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码
- 3、建议全站设置统一的编码:JSP/Servlet统一设置成UTF-8或者GBK
-
也即在Filter中Response设置:
- response.setCharacterEncoding(“UTF-8”);
- response.setContentType("text/html;charset=UTF-8");