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);
}
}