利用java动态代理处理中文乱码

1.在过滤器(MyFilter)中添加动态代理代码,生成增强型的request(处理乱码),然后通过chain(request,response)放行。

2.当你发起接口请求的时候,会自动执行ServletDemo1中的doGet(HttpServletRequest request, HttpServletResponse response),此处接收到的request就是上面增强型的request,从而实现了通过JDK动态代理处理乱码的问题。

3. 源码如下:

package cn.filter;

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.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;


public class MyFilter implements Filter
{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 要增强的方法:request.getParameter
		// 被代理的对象: request
		
		final HttpServletRequest request=(HttpServletRequest)req;
		
		// 动态的生成代理对象
		HttpServletRequest hsr=(HttpServletRequest)Proxy.newProxyInstance(
				request.getClass().getClassLoader(), 
				request.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						
						// 1 判断是否是需要增强的方法 getParameter
						if("getParameter".equals(method.getName()))
						{
							// 知道getParameter使用的是哪个提交方式 
							String m = request.getMethod();
							// 判断是get还是post
							if("get".equalsIgnoreCase(m))
							{
								// 以前方法调用后的乱码
								String s =(String)method.invoke(request, args);
								// 增强--解决乱码
								s=new String(s.getBytes("iso8859-1"),"utf-8");
								return s;
							}
							
							if("post".equalsIgnoreCase(m))
							{
								request.setCharacterEncoding("utf-8");
								
							}
						}
						
						// 如果是别的方法
						return method.invoke(request, args);
					}
				});
		
		// 放行
		chain.doFilter(hsr, response);
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}
package cn.web;

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

/**
 * Servlet implementation class ServletDemo1
 */

public class ServletDemo1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		System.out.println(username);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值