解决servlet中get方式中中文乱码问题(二):装饰者模式使用

注意,这里是针对Tomcat容器中get方式提交的servlet中获得参数,参数中有中文的时候乱码的问题

之前我已经讲过,Tomcat8.0及以上URIEncoding都是utf-8的默认编码,不会出现get方式乱码的问题;

    只有Tomcat7.0及以下的版本,默认的URIEncoding才是ISO-8859-1才会出现中文乱码,当然我们也可以在Tomcat的conf中的server.xml中修改默认的URLEncoding来解决此问题(但是我们这里测试是要求不能修改Tomcat容器中的默认编码的时候哦安静),前面关于Tomcat的编码已经有了详细讲解,链接如下,这里就不再赘述了。


在实现装饰者对getParameter进行加强的时候,我们发现:

HttpServletRequest只是一个接口,我们继承重写不能使用接口;所以我们查阅API发现


其中有一个实现子类HttpServletRequestWrapper,所以后面我们继承自HttpServletRequestWrapper进行重写getParameter!

jsp中的代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>测试get方式中文乱码</title>
  </head>
  <body>
	<form action="${pageContext.servletContext.contextPath }/servlet/TestEncodingServlet">
		name:<input type="text" name="name" />
		<input type="submit" value="提交" />
	</form>
  </body>
</html>

servlet中的代码:

package day03;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestEncodingServlet extends HttpServlet {
	
	private static final long serialVersionUID = 3996799889172019227L;

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		String name = request.getParameter("name");
		System.out.println(name);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");

	}

}

xml中的配置:


filter中的代码:

package day03;

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;
/**
 * 解决get方式中文参数乱码问题
 * @author mzy
 *
 */
public class EncodingFilter implements Filter {
	@Override
	public void init(FilterConfig arg0) throws ServletException {}
	
	@Override
	public void destroy() {}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest tmpRequest = (HttpServletRequest)request;
		/*
		 * 如果是POST方式提交
		 */
		request.setCharacterEncoding("utf-8");
		// 装饰者类使用,针对get方式中的中文参数
		MyHttpRequest myRequest = new MyHttpRequest(tmpRequest);
		/*
		 * 放行:注意是放行我们装饰之后的request
		 */
		chain.doFilter(myRequest, response);
		
	}
}

/**
 * 装饰者类
 * 		1.继承自HttpServletRequestWrapper非final的
 * @author mzy 
 */
class MyHttpRequest extends HttpServletRequestWrapper {
	// 2.声明一个被装饰者类型的成员变量
	private HttpServletRequest request;
	
	// 3.接收被装饰者类对象
	public MyHttpRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}
	/*
	 * 4.加强方法:重写getParameter方法
	 */
	@Override
	public String getParameter(String name) {
		try {
			// 得到原来的参数
			String value = request.getParameter(name);
			
			// 判断是否是get方式提交的
			if ("GET".equals(request.getMethod())) {
				value = new String(value.getBytes("ISO-8859-1"), "utf-8");
			}
			
			return value;
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_36791569/article/details/80373979