版权声明:https://blog.csdn.net/haochaoguo1988 https://blog.csdn.net/haochaoguo1988/article/details/82882128
原始处理get post 请求乱码
String newEncoding = new String( params.getBytes("iso-8859-1") , "utf-8" );
原理分析
post 处理乱码方式
req.setCharacterEncoding("UTF-8");
resp.setHeader("content-type", "text/html;charset=utf-8");
动态代理参数讲解
动态代理的代码都是固定的
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
参数1: 动态创建的不在虚拟机中 需要使用类加载器 加载动态创建的类 当类.class.getClassLoader()
参数2: 动态创建的类 里面没有方法 所以需要方法 方法在接口中 目标的接口 目标类实例.getClass().getInterface()
参数3: 执行处理类 对方法进行实现 每一次 调用目标类的方法 执行处理类的invoke方法都会被调用一次
invoke(Object proxy, Method method, Object[] args)
参数1: 代理类的对象(没用)
参数2: 执行的方法
参数3: 参数
get 处理乱码方式
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)resp;
try {
//处理request 的post乱码
request.setCharacterEncoding("utf-8");
//处理响应回去的编码
response.setHeader("content-type", "text/html;charset=utf-8");
System.out.println("post乱码处理");
HttpServletRequest myRequest =(HttpServletRequest)Proxy.newProxyInstance(
EncodingFilter.class.getClassLoader(),
request.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//必须是get请求 获得请求方式
String submitMethod = request.getMethod();
if("GET".equalsIgnoreCase(submitMethod)){
//一定是get请求
//方法名必须是getParameter
if("getParameter".equals(method.getName())){
if(args.length==0){
return null;
}
//增强 //获得以前乱码的参数
String parameter = request.getParameter((String) args[0]);
return new String(parameter.getBytes("iso-8859-1") , "utf-8");
}
}
return method.invoke(request, args);
}
});
chain.doFilter(myRequest, response);
} catch (Exception e) {
e.printStackTrace();
}
}
spring MVC 的 web.xml文件
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
spring boot 的 pom.xml 文件
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>