动态代理解决全站乱码问题

 动态代理解决全站乱码问题
    思路:
      1.在过滤器中通过request.getMethod() 得到请求方式:get/post
      2.若为get String userName = request.getParameter("username");
                          userName = new String("userName".getBytes("iso-8859-1"),"utf-8"); 
      3.若为post: request.setCharacterEncoding("utf-8");

get/post.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>Insert title here</title>
	</head>
	<body>
	 	<h3>get请求</h3>
	    <form action="MyEncodingServlet" method="get"> 
	         	 用户名:<input type="text" name="username"/> <br/>
	          <input type="submit" value="提交"/>
	    </form>
	    
	    <h3>post请求</h3>
	    <form action="MyEncodingServlet" method="post"> 
	                用户名:<input type="text" name="username"/><br/>
	                <input type="submit" value="提交"/>
	    </form>
	    
	</body>
</html>

MyEncodingServlet

    注:servlet别忘了注册

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 MyEncodingServlet extends HttpServlet {
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("来了一个请求");
	
		String userName = request.getParameter("username");
		System.out.println(userName);
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("来了一个post请求");
		doGet(request, response);
	}

}

EncodingFilter.java

      注:过滤器别忘了注册

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;

/**
 * 动态代理解决全站乱码问题
 *     思路:
 *         1.在过滤器中通过request.getMethod() 得到请求方式,get/post
 *         2.若为get String userName = request.getParameter("username");
 *                          userName = new String("userName".getBytes("iso-8859-1"),"utf-8"); 
 *         3.若为post: request.setCharacterEncoding("utf-8");
 */
public class EncodingFilter implements Filter {

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

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		  
		//将request对象转换为HttpServletRequest类型对象:处理的是HttpServletRequestl类型的方法 
		//声明为final类型:在匿名类中使用最好是一个常量值
		final HttpServletRequest req = (HttpServletRequest)request;
		
		//通过字节码反射得到代理对并由JDK在内存中创建
		HttpServletRequest myRequest = (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; //用于接收方法返回的值
						
						 //处理gerParameter()方法
						if(method.getName().equalsIgnoreCase("getParameter")){
							
							//获取请求方式
							String md = req.getMethod();
							if(md.equalsIgnoreCase("get")){ //get请求
								
								//相当于执行req中的getParameter("");方法将返回的值进行编码设置
								String v =  (String) method.invoke(req, args);
							    obj =  new String(v.getBytes("iso-8859-1"),"utf-8");
							    
							}else{ //post请求
								
								req.setCharacterEncoding("utf-8");
								obj = method.invoke(req, args);
								
							}
						}else{
							obj = method.invoke(req, args);
						}
						
						return obj; //将方法的返回值返回
					}
				});
		
		//将代理对象放行
		chain.doFilter( myRequest, response);
	}

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

}

动态代理为了解决   

       装饰者模式的弊端:如果被实现的接口中的方法较多,自定义的类就要一一实现,
  造成装饰类中的方法过多,冗余

发布了47 篇原创文章 · 获赞 7 · 访问量 2360

猜你喜欢

转载自blog.csdn.net/qq_43616898/article/details/100048784