一、代理模式
代理模式传送门:博客地址
二、Java动态代理
Java动态代理传送门:博客地址
三、乱码解决思路
对原有的HttpServletRequest类中的getParameter()方法进行增强。
对方法进行增强三种方式:
① 继承,覆盖原有方法(在解决乱码中不可用,HttpServletRequest是TomCat创建)
②装饰设计模式(在解决乱码中可用)
③动态代理(在解决乱码中可用)
四、乱码解决
1、定义Filter
//定义类实现Filter接口
public class EncodingFilter implements Filter
2、web.xml配置
<filter>
<display-name>EncodingFilter</display-name>
<filter-name>EncodingFilter</filter-name>
<filter-class>cn.itcast.web.filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、EncodingFilter 类中的代码实现
package cn.itcast.web.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.http.HttpServletRequest;
public class EncodingFilter implements Filter {
public EncodingFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//需要被增强的目标对象
HttpServletRequest req = (HttpServletRequest) request;
String method = req.getMethod();
if (method.equals("GET")) {
//代理对象
HttpServletRequest enhanceRequst = (HttpServletRequest) Proxy.newProxyInstance(
/**
* req.getClass().getClassLoader() 与目标对象相同的类加载器
* req.getClass().getInterfaces() 与目标对象相同的字节码对象数组
*/
req.getClass().getClassLoader(),
req.getClass().getInterfaces(),
new InvocationHandler() {
/**
* Object proxy 代理对象
* Method method 调用方法
* Object[] args 传递参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//判断是否是想要执行的方法
if(method.getName().equals("getParameter")) {
//对请求参数进行乱码设置后返回给调用者
String requestArgs = (String) method.invoke(req, args);
requestArgs = new String(requestArgs.getBytes("iso8859-1"), "UTF-8");
return requestArgs;
}
//如果不是想要执行的方法,则不需要对其进行增强
return method.invoke(req, args);
}
}
);
//传递增强后的enhanceRequest
chain.doFilter(enhanceRequst, response);
}else if (method.equals("POST")) {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}else {
}
}
public void init(FilterConfig fConfig) throws ServletException {
}
}