过滤器解决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接受浏览器传过来的数据时,就不用考虑乱码的问题,过滤器已经帮我们解决了。


在处理中文乱码问题时,需要注意以下几点: 1. 确认请求的数据编码格式。 2. 对于 POST 请求,需要对请求体进行解码。 3. 对于响应数据,需要设置正确的编码格式。 下面是一个示例代码,演示如何使用 Python Flask 框架编写一个过滤器解决中文乱码问题: ```python from flask import Flask, request app = Flask(__name__) # 过滤器,处理 POST 请求的中文乱码问题 @app.before_request def before_request(): content_type = request.headers.get('Content-Type') if content_type and 'charset' in content_type.lower(): # 获取请求体编码格式 encoding = content_type.split('charset=')[-1] if encoding.lower() != 'utf-8': # 如果请求体编码格式不是 utf-8,则进行解码 request_charset = request.charset or encoding request.data = request.data.decode(request_charset).encode('utf-8') # 路由处理函数 @app.route('/', methods=['POST']) def index(): # 处理请求数据 data = request.form['data'] # 处理响应数据 resp = '你发送的数据为:{}'.format(data) return resp.encode('utf-8') if __name__ == '__main__': app.run() ``` 在上面的代码中,我们使用了 Flask 的 `before_request` 过滤器来处理 POST 请求的中文乱码问题。在过滤器中,我们首先获取了请求的 `Content-Type` 头部信息,然后判断该信息中是否包含编码格式的信息。如果包含,则获取编码格式并进行解码,最后将解码后的数据转换为 utf-8 编码,以便后续处理。在路由处理函数中,我们首先获取请求数据,然后处理响应数据并设置正确的编码格式返回。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值