标签:tps instance eval 原因 lenovo etc void bytes 匿名内部类
javaweb中常常遇到表单提交后,读取表单数据乱码,特别是从request域存取数据最为频繁
,常用的解决方法就是设置全局乱码文件码通过Filter过滤。无论是post方式提交还是get方式都适用。
我用的JDK1.8,用了Lambda表达式,1.8以下的可以用匿名内部类代替
首先创建一个Filter文件,实现代码如下:
package com.practice.web.filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Proxy;
import java.util.regex.Pattern;
/**
@since 1.0.0
*/
public class MyEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//将ServletRequest 强转为HttpServletRequest
HttpServletRequest httpRequest = (HttpServletRequest) request;
//动态代理,接收增强后的HttpServletRequest
HttpServletRequest enhanceRequest = (HttpServletRequest) Proxy.newProxyInstance(
httpRequest.getClass().getClassLoader(),//获取HttpServletRequest 的类加载器
httpRequest.getClass().getInterfaces(),//获取HttpServletRequest 所实现的所有接口,此处为Filter 接口
//Lambda表达式
(proxy, method, args) -> {
//用Pattern匹配所有的getParameter*()方法
boolean isEqueals = Pattern.matches("getParameter\\w*", method.getName());
if (isEqueals) {
//从表单获取到的参数,此时为乱码,原因:invokeValue 用UTF-8编码,但是用ISO8859-1解码
String invokeValue = (String) method.invoke(httpRequest, args);
//解决乱码:将invokeValue 用ISO8859-1编码再用UTF-8解码
invokeValue = new String(invokeValue.getBytes("ISO8859-1"), "UTF-8");
return invokeValue;
}
//对于其他方法,直接默认返回即可
return method.invoke(httpRequest, args);
});
//最后一步,放行
chain.doFilter(enhanceRequest, response);
}
@Override
public void destroy() {
}
}
web.xml中配置如下:
最后将其置顶于web.xml中,才能过滤所有
标签:tps instance eval 原因 lenovo etc void bytes 匿名内部类
原文地址:https://www.cnblogs.com/jay8576/p/9534944.html