JAVA利用动态代理解决中英文乱码的问题

** 利用动态代理解决中英文乱码的问题**

**目的:无论是get方式还是post方式都不会出现中英文乱码的问题
思路:

  1. 新建一个web工程,然后新建一个HTML文件

  2. 新建一个Servlet

  3. 新建一个过滤器,在这个过滤器上对request上的getParameter()进行增强

    		思路: 3.1 首先需要判断是get方式还是post方式。利用request.getMethod()方法
    					3.2如果是get方式,调用原先的request.getParameter(),返回的是一个字符串,对该字符串进行转码
    					3.3如果是post方式就设置request.setCharaterEncoding("utf-8")**
    

代码实现

html文件

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>gepost方式提交</h1>
<form action="/DynamicProxy/ServletDemo" method="post" >
User:<input type="" name="username"/><br/>
<input type="submit"/>
</form>

<h1>get方式提交</h1>
<form action="/DynamicProxy/ServletDemo" method="get" >
User:<input type="" name="username"/><br/>
<input type="submit"/>
</form></body>
</html>

新建一个Servlet

package com.it.test00;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ServletDemo
 */
public class ServletDemo extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ServletDemo() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		 String um =request.getParameter("username");
		 System.out.println(request.hashCode()+"   "+um);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String um =request.getParameter("username");
		System.out.println(request.hashCode()+"   "+um);
	}

}

创建过滤器

package com.it.test00;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

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 com.sun.xml.internal.bind.v2.runtime.reflect.opt.MethodAccessor_Short;


public class EncodingFilter implements Filter {

    public EncodingFilter() {
        
    }


	public void destroy() {
		
	}

	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	//将request对象转换成HttpServletRequest
	final HttpServletRequest req = (HttpServletRequest)request;
		//让JDK在内存中生成代理对象:增强了req对象上的getParameter(name);
		HttpServletRequest myReq =	(HttpServletRequest)Proxy.newProxyInstance(EncodingFilter.class.getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
			
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				Object obj = null;
				
				if(method.getName().equals("getParameter")) {
					//获取本次请求的方式
					String md = req.getMethod();
					if("get".equalsIgnoreCase(md)) {
						//get方式
						String v =(String)method.invoke(req, args);
						//转码
						String vv = new String(v.getBytes("iso-8859-1"), "UTF-8");
						return vv;
					}else {
						//post方式
						req.setCharacterEncoding("UTF-8");
						obj=method.invoke(req, args);
					}
					
				}else {
					obj = method.invoke(req, args);
				}
				return obj;
			}
		});
		//打印代理对象的哈希码,确保是同一个对象
		System.out.println(myReq.hashCode());
		//将代理对象放行
		chain.doFilter(myReq, response);
		
	}


	public void init(FilterConfig fConfig) throws ServletException {

	}

}

最终结果:
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_32653065/article/details/89920694
今日推荐