使用过滤器和request装饰增强来彻底解决乱码问题

在客户端以get或者post方式提交数据时,可能会出现客户端与服务端编码集不匹配而发生乱码的现象。

在对post方式产生的乱码我们可以用         request.setCharacterEncoding("utf-8") ;   语句来解决。

在对get方式产生的乱码我们可以用              String s = request.getParameter("xxx");
                                                                            s = new String(s.getBytes("ISO-8859-1"),"utf-8");   
这样的方式来解决


因为每个页面都需要乱码处理,所以我们可以将解决乱码方式与Filter结合起来,用装饰模式来增强request以实现彻底解决乱码格式。


代码如下

package filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * 通过加强request完全解决乱码问题 get/post
 * 
 * @author seawind
 * 
 */
public class EncodingFilter2 implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 解决post乱码
		request.setCharacterEncoding("utf-8");
		// 解决get 通过装饰模式 加强getParameter
		MyEncodingRequest myEncodingRequest = new MyEncodingRequest(
				(HttpServletRequest) request);

		chain.doFilter(myEncodingRequest, response);

	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

}

class MyEncodingRequest extends HttpServletRequestWrapper {

	private HttpServletRequest request;

	// 加强方法,解决get乱码问题
	@Override
	public String getParameter(String name) {
		// 获得原来的值
		String value = request.getParameter(name);
		// 判断用户提交方式
		String method = request.getMethod();
		if (method.equalsIgnoreCase("post")) {
			// post提交
			return value;
		}
		// 如果value 为 null呢
		if (value == null) {
			return null;
		}

		try {
			// 解决get方式乱码
			value = new String(value.getBytes("ISO-8859-1"), "utf-8"); // 通过encode
										   // 和
										   // decode
										   // 看效果是否相同
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return value;
	}

	public MyEncodingRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值