对于国内的程序员来说,在做项目时避免不了的问题是中文乱码问题。
如果不使用过滤器的话,在每个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; } }
过滤器中的代码实现,需要注意的是,在过滤器中放行传入的request对象,是我们经过增强后的MyRequest对象。
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接受浏览器传过来的数据时,就不用考虑乱码的问题,过滤器已经帮我们解决了。