过滤器解决get和post方式提交的中文乱码

       对于国内的程序员来说,在做项目时避免不了的问题是中文乱码问题。
       如果不使用过滤器的话,在每个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接受浏览器传过来的数据时,就不用考虑乱码的问题,过滤器已经帮我们解决了。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值