import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharacterFilter extends HttpFilter {
public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 解决全站 response 的乱码问题
response.setContentType("text/html;charset=utf-8");
// 解决全站 request 中文参数乱码问题
request.setCharacterEncoding("utf-8"); // 只能解决post方式下的乱码问题
// 对 request 进行包装 包装getParameter方法
MyRequest myrequest = new MyRequest(request);
// 放行
chain.doFilter(myrequest, response);
}
}
package com.character.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.HttpServletResponse;
public abstract class HttpFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response=(HttpServletResponse) res;
doFilter(request, response, chain);
}
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
FilterChain chain) throws IOException, ServletException ;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
package com.character.filter;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
//不能用继承 因为根本不知道被包装对象是什么类型 只知道实现了哪个接口
//1. 和被包装对象实现同一个接口
//2. 持有一个被包装类的实例对象
//3. 实现需要包装的方法,对于不需要包装的方法原封调用被包装对象的
//我们可以通过继承默认包装类来包装request
public class MyRequest extends HttpServletRequestWrapper {
public MyRequest(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
// 覆写 getParameter
public String getParameter(String name){
// 调用被包装对象的方法获得表单参数
String value = super.getParameter(name);
if(value==null)
return null;
// 通过父类调用被包装对象的方法 获得请求方式
String method = super.getMethod();
if(!"get".equalsIgnoreCase(method))
return value;
try {
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.character.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>