对于国内的程序员来说,在做项目时避免不了的问题是中文乱码问题。
如果不使用过滤器的话,在每个servlet中都要进行设置编码,如果是post请求还好,但是如果是get请求,就要手动进行转码,相当麻烦。
下面来介绍一下过滤器解决表单提交中的中文乱码问题。
过滤器,顾名思义就是过滤用的,它可以在请求、响应、或者servlet中请求转发等操作发生时先进行执行,之后程序再往下执行,这里起到一个过滤的作用。
平常在servlet中接受请求的数据时可以使用request.getParameter(name)或者request.getParameterValues(name)进行获取,但这些方法如果不进行编码设置时,得到的数据都是乱码,这是因为浏览器传过来的数据的编码格式是iso-8859-1,而我们的开发平台一般都是使用的是utf-8,所以就会出现乱码现象。
这时也就是说request.getParameter(name)这些方法满足不了我们当前的需求,此时我们可以利用装饰者设计模式对这些方法进行增强。
而为了方便程序员对HttpServletRequest 进行包装,javaEE中就已经提供好了一个基类HttpServletRequestWrapper这个类中已经实现其他需要实现的接口,我们只需要编写一个自己的类例如MyRequest继承它,需要增强哪个方法,就对哪个方法进行重写就行,没有重写的方法原来是如何执行的现在还会如何执行。
下面是具体代码实现过程:
public class MyRequest extends HttpServletRequestWrapper{
HttpServletRequest request=null;
public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
String method = request.getMethod();
String value=null;
try {
request.setCharacterEncoding("utf-8");
value = request.getParameter(name);
if("get".equalsIgnoreCase(method)){
value = new String(value.getBytes("iso-8859-1"),"utf-8");
}
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String method = request.getMethod();
String[] values=null;
try {
request.setCharacterEncoding("utf-8");
values = request.getParameterValues(name);
if("get".equalsIgnoreCase(method)){
int i=0;
for (String str : values) {
values[i++] = new String(str.getBytes("iso-8859-1"),"utf-8");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return values;
}
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
MyRequest myRrequest = new MyRequest(request);
chain.doFilter(myRrequest, response);
}
使用过滤器后,这样在用servlet接受浏览器传过来的数据时,就不用考虑乱码的问题,过滤器已经帮我们解决了。