Cheug's Blog

当前位置:网站首页 / JAVA / 正文

使用过滤器解决get&post请求中文乱码

2019-08-05 / JAVA / 1348 次围观 / 0 次吐槽 /

tomcat8.0以上版本

        get请求不会有中文乱码问题

        post请求会有中文乱码问题

                解决方案:设置request.setCharacterEncoding("utf-8");   这种设置只能在post请求中有效


tomact7以下版本(包括7)

        get请求会有中文乱码问题

        post请求会有中文乱码问题

                解决方案:设置request.setCharacterEncoding("utf-8");

    如何解决tomcat7中的get请求中文乱码问题?

            两种方法:

                    1.在server.xml配置URIEncoding="UTF-8"

                        如果是项目开发完成了,打包成war包,放在tomcat7.0/webapps的时候,修改tomcat/conf/server.xml,在connector中添加 URIEncoding="UTD-8"

                        如果是开发阶段,在eclipse开发工具的server/tomcat7.0/server.xml配置,添加 URIEncoding="UTD-8"

                    2.把字符串转回字节码,然后再进行UTF-8编码

                            String username = request.getParameter("username");

                            //先还原ISO编码,再转成utf-8编码

                            username = new String(username.getBytes("ISO-8859-1"),"UTF-8");

             对比:改配置server.xml的方式便捷


在server.xml配置URIEncoding是不可以解决post请求的中文乱码问题

post请求的中文乱码问题一定要使用request.setCharacterEncoding("utf-8"); 


如果有多个POST请求,不可能重复使用request.setCharacterEncoding("utf-8") 来解决

解决方案:写一个编码的过滤器MyEncoding拦截所有请求

public class MyEnCodeingFilter implements Filter{

	@Override
	public void destroy() {}
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		HttpServletRequest hsr = (HttpServletRequest) request;
		if(hsr.getMethod().equalsIgnoreCase("get")) {//get
			//解决get中文乱码
			MyRequest myRequest = new MyRequest(hsr);
			chain.doFilter(myRequest, response);//放行
		}else {//post
			//解决POST中文乱码
			request.setCharacterEncoding("utf-8");
			chain.doFilter(request, response);//放行
		}
	}

}
class MyRequest extends HttpServletRequestWrapper{
	private HttpServletRequest request;
	private boolean isEncoding = false;//是否已经utf-8编码
	public MyRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}
	@Override
	public String getParameter(String name) {
		return getParameterMap().get(name)[0];
	}
	@Override
	public Map<String, String[]> getParameterMap() {
		Map<String,String[]> map = request.getParameterMap();
		
		if(isEncoding == true) {//已经UTF-8编码
			return map;
		}
		//遍历value 改为UTF-8编码
		for(Entry<String,String[]> entry : map.entrySet()) {
			//取数组值
			String[] values = entry.getValue();
			for(int i=0;i<values.length;i++) {
				try {
					values[i] = new String(values[i].getBytes("ISO-8859-1"),"UTF-8");
				} catch (UnsupportedEncodingException e) {
					//编码不存在抛异常
					e.printStackTrace();
				}
			}
		}
		isEncoding = true;
		return map;
	}
}


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.