Post 和 get 请求乱码问题处理

版权声明:https://blog.csdn.net/haochaoguo1988 https://blog.csdn.net/haochaoguo1988/article/details/82882128

原始处理get post 请求乱码

String newEncoding = new String( params.getBytes("iso-8859-1") , "utf-8" );

 原理分析

  post 处理乱码方式

req.setCharacterEncoding("UTF-8");
resp.setHeader("content-type", "text/html;charset=utf-8");

动态代理参数讲解 

 动态代理的代码都是固定的
   public static Object newProxyInstance(ClassLoader loader,
			              Class<?>[] interfaces,
			              InvocationHandler h)
   参数1: 动态创建的不在虚拟机中  需要使用类加载器 加载动态创建的类   当类.class.getClassLoader()
   参数2: 动态创建的类 里面没有方法 所以需要方法  方法在接口中  目标的接口  目标类实例.getClass().getInterface()
   参数3: 执行处理类 对方法进行实现  每一次 调用目标类的方法 执行处理类的invoke方法都会被调用一次
	invoke(Object proxy, Method method, Object[] args)
	参数1: 代理类的对象(没用)
	参数2: 执行的方法
	参数3: 参数

  get 处理乱码方式

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {	
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)resp;
		try {
			//处理request 的post乱码
			request.setCharacterEncoding("utf-8");
			//处理响应回去的编码
			response.setHeader("content-type", "text/html;charset=utf-8");
			System.out.println("post乱码处理");
			HttpServletRequest myRequest =(HttpServletRequest)Proxy.newProxyInstance(
					EncodingFilter.class.getClassLoader(), 
					request.getClass().getInterfaces(), 
					new InvocationHandler() {
						@Override
						public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
							//必须是get请求  获得请求方式
							String submitMethod = request.getMethod();
							if("GET".equalsIgnoreCase(submitMethod)){
								//一定是get请求
								//方法名必须是getParameter
								if("getParameter".equals(method.getName())){
									if(args.length==0){
										return null;
									}
									//增强  //获得以前乱码的参数
									String parameter = request.getParameter((String) args[0]);
									return  new String(parameter.getBytes("iso-8859-1") , "utf-8");
								}
							}
							return method.invoke(request, args);
						}
					});
			chain.doFilter(myRequest, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

spring MVC 的 web.xml文件

<filter>  
     <filter-name>characterEncodingFilter</filter-name>  
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
     <init-param>  
         <param-name>encoding</param-name>  
         <param-value>UTF-8</param-value>  
     </init-param>  
     <init-param>  
         <param-name>forceEncoding</param-name>  
         <param-value>true</param-value>  
     </init-param>  
</filter>  
<filter-mapping>  
     <filter-name>characterEncodingFilter</filter-name>  
     <url-pattern>/*</url-pattern>  
</filter-mapping> 

 spring boot 的 pom.xml 文件

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	<java.version>1.8</java.version>
</properties>

https://stackoverflow.com/questions/27606769/how-to-overwrite-stringhttpmessageconverter-default-charset-to-use-utf8-in-sprin

https://stackoverflow.com/questions/20935969/make-responsebody-annotated-spring-boot-mvc-controller-methods-return-utf-8

这篇文章做了另外一番解释

猜你喜欢

转载自blog.csdn.net/haochaoguo1988/article/details/82882128