Request与Response中文乱码处理(含过滤器)

一、HTTPServletRequest

这个对象封装了客户端提交过来的一切数据

1、作用

(一)、获取客户端请求头信息

//获取请求头信息,得到枚举集合
		Enumeration<String> headerNames = req.getHeaderNames();
		//遍历头信息
		while(headerNames.hasMoreElements()) {
			String name=headerNames.nextElement();
			String value=req.getHeader(name);
			System.out.println(name+":"+value);
		}

(二)、获取客户端提交过来的数据

String name=req.getParameter("username");
String password=req.getParameter("password");

2、获取中文数据时出现乱码

  • 如果是GET方式(浏览器一般都对其做了相应处理,所以一般也不会出现此类乱码问题)

(1)用字符串对url进行反编码,先将编码格式改为ISO-8859-1,再用UTF-8转换

//假如get方式提交时出现中文乱码
		String name=req.getParameter("username");
		String password=req.getParameter("password");
		//先让提交过来的请求参数回到ISO-8859-1对应的编码格式,把它变成字节数组
		String username=new String(name.getBytes("ISO-8859-1"),"UTF-8");
		System.out.println("name"+username+";password"+password);

(2)在Tomcat的conf/server.xml找到

<Connector port="8080" redirectPort="8443" protocol="HTTP/1.1" connectionTomeout="20000" URIEncoding="UTF-8" />
  • 如果是POST方式
//假如post方式提交时出现中文乱码
		//设置请求体里面的编码格式:在获取到参数之前
		req.setCharacterEncoding("UTF-8");
		String name=req.getParameter("username");
		String password=req.getParameter("password");
		System.out.println("name"+name+";password"+password);

二、HttpServletResponse

负责返回数据给客户端

//把数据输出到页面上
		//以字节流的方式输出到页面上,图片,文件,字节文件
		resp.getOutputStream().write("hello world".getBytes());
		//以字符流对页面进行输出,字符串(响应的数据有中文时会出现乱码)
		resp.getWriter().write("hello world!!!!");

响应的数据有中文时,可能会出现乱码

//解决以字符流输出时的乱码问题
	private void test02(HttpServletResponse resp) throws IOException{
		//1.输出到客户端的时候,指定编码格式
		resp.setCharacterEncoding("UTF-8");
		//2.指定浏览器看这份数据时以什么方式打开
		resp.setHeader("Content-type", "text/html; charset=UTF-8");
		resp.getWriter().write("大家好");
	}
	
//解决以字节流输出时的乱码问题
	private void test03(HttpServletResponse resp) throws IOException{
		//客户端要以指定的格式来读取这份流
		resp.setHeader("Content-type", "text/html; charset=UTF-8");
		//以UTF-8的编码格式发送字节流到客户端
		resp.getOutputStream().write("大家好".getBytes("UTF-8"));
	}
	
//解决以字节字符流通用的解决乱码的方式
	private void test04(HttpServletResponse resp) throws IOException{
		//设置响应的格式是text或者HTML,并且告知客户端以utf-8的方式解码
		resp.setContentType("text/html; charset=UTF-8");
		//resp.getOutputStream().write("大家好".getBytes());
		resp.getWriter().write("好好学习,天天向上");
	}

总结:对于我们一般编程,将这两句写在最前面基本上可以处理绝大多数乱码问题
request.setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html;charset=UTF-8”);

三、利用过滤器处理乱码

在每个servlet都来处理乱码现象,会造成代码冗余,所以可以写一个过滤器拦截所有页面并对其进行乱码处理

import java.io.IOException;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter("/*")
/*
 * @WebFilter(value="/*" ,initParams = {
        @WebInitParam(name = "encode", value = "GBK")
        })
 */
public class EncodingFilter implements Filter {
	//存储编码格式信息
	private String encode = null;
   
	public void destroy() {
	}

	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//转换
		  HttpServletRequest req = (HttpServletRequest)request;
		  HttpServletResponse resp = (HttpServletResponse)response;
		  
		  /*
		   * 判断在web.xml文件中是否配置了编码格式的信息
		   * 如果为空,则设置编码格式为配置文件中的编码格式
		   * 否则编码格式设置为utf-8
		   */
		  if(this.encode != null && !this.encode.equals("")){
		   req.setCharacterEncoding(this.encode);
		   resp.setContentType("text/html;charset="+this.encode);
		  }else{
		   req.setCharacterEncoding("utf-8");
		   resp.setContentType("text/html;charset=utf-8");
		  }
		  
		  /*
		   * 使用doFilter方法调用链中的下一个过滤器或目标资源(servlet或JSP页面)。
		   * chain.doFilter处理过滤器的其余部分(如果有的话),最终处理请求的servlet或JSP页面。
		   */
		  chain.doFilter(req, resp);
		
	}

	
	public void init(FilterConfig fConfig) throws ServletException {
		//获取在web.xml文件中配置了的编码格式的信息
		  this.encode = fConfig.getInitParameter("encode");
	}
}

你可能感兴趣的:(Java学习)