编码一直是编写程序较为烦人的一点,在javaweb中,比如服务器tomcat编码是ios-8859-1,所以处理编码通常是servlet中对request和response调用request.setCharacterEncoding("utf-8"),但是这种方法只能处理post请求,get请求需要对每一个参数都进行重新编码,十分繁琐。所以想通过编写一个过滤全部访问资源的过滤器和一个重写了request.getParameter(arg0)这个方法的类(装饰者模式对request装饰)然后filter通行。将传递到servlet的request修改了。只要导入下面两个类,就完成了全站的编码了。代码实现:
//重写的类
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/*
* 装饰request
* @author cxf
*/
public class EncodingRequest extends HttpServletRequestWrapper{
private HttpServletRequest req;
public EncodingRequest(HttpServletRequest request) {
super(request);
this.req=request;
}
@Override
public String getParameter(String name)
{
String n=req.getParameter(name);
try {
n=new String(n.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO 自动生成的 catch 块
throw new RuntimeException(e);
}
return n;
}
}
//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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@WebFilter("/*")
public class encodingFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
HttpServletRequest req=(HttpServletRequest)request;
if(req.getMethod().equals("GET"))
{
EncodingRequest er=new EncodingRequest(req);
chain.doFilter(er, response);
}else if(req.getMethod().equals("POST"))
{
chain.doFilter(request, response);
}
}
public void init(FilterConfig fConfig) throws ServletException {
}
}