一下是过滤器处理tomcat 7 乱码问题
@WebFilter("/*") // 过滤所有资源
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 基于HTTP
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.setCharacterEncoding("UTF-8");
// 得到请求类型 (GET|POST)
String method = request.getMethod();
// 如果是GET请求,则判断服务器版本
if ("GET".equalsIgnoreCase(method)) { // 忽略大小写比较
// 得到服务器版本
String serverInfo = request.getServletContext().getServerInfo(); // Apache Tomcat/7.0.79
// 通过截取字符串,得到具体的版本号
String version = serverInfo.substring(serverInfo.indexOf("/")+1,serverInfo.indexOf("."));
// 判断服务器版本是否是Toncat7级以下
if (version != null && Integer.parseInt(version) < 8) {
// Tomcat7及以下版本的服务器的GET请求
MyWrapper myRequest = new MyrWrapper(request);
// 放行资源
//String name = myRequest.getRequestURI();
//String a = myRequest.getServletPath();
myRequest.setAttribute("flag","myRequest");
request.setAttribute("flag","request");
filterChain.doFilter(myRequest, response);
return;
}
}
// 处理POST请求 (只针对POST请求有效,GET请求不受影响)
filterChain.doFilter(request,response);
}
/**
* 1. 定义内部类 (类的本质是request对象)
* 2. 继承 HttpServletRequestWrapper包装类
* 3. 重写getarameterP()方法
*/
class MyWrapper extends HttpServletRequestWrapper {
// 定义成员变量 HttpServletRequest对象 (提升构造器中request对象的作用域)
private HttpServletRequest request;
/**
* 带参构造
* 可以得到需要处理的request对象
* @param request
*/
public MyWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
/**
* 重写getParameter方法,处理乱码问题
* @param name
* @return
*/
@Override
public String getParameter(String name) {
// 获取参数 (乱码的参数值)
String value = request.getParameter(name);
// 判断参数值是否为空
if (StrUtil.isBlank(value)) {
return value;
}
// 通过new String()处理乱码
try {
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
@Override
public void destroy() {
}
}
注意:注意这段代码的问题,在请求转发经过tomcat7 的那一段判断版本的if代码后显示空白页面,原因是经过wrapper过滤重新包装后,无法取得request参数值,主要错误原因是在重写的MyWrapper类中添加了私有成员request,request.getparameter就会调用原生方法,而不是调用wrapper中的getparameter方法,所以无法访问到request的属性值。改正如下:
class MyWrapper extends HttpServletRequestWrapper {
/**
* 带参构造
* 可以得到需要处理的request对象
* @param request
*/
public MyWrapper(HttpServletRequest request) {
super(request);
}
/**
* 重写getParameter方法,处理乱码问题
* @param name
* @return
*/
@Override
public String getParameter(String name) {
// 获取参数 (乱码的参数值)
String value = super.getParameter(name);
// 判断参数值是否为空
if (StrUtil.isBlank(value)) {
return value;
}
// 通过new String()处理乱码
try {
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("encodingfilter decode utf-8");
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
注意:在获取request对象中的属性的时候,可以先判断是否为空,抛出异常,这样页面空白或者无法访问时容易定位bug位置。
注意:在filter 中请求转发只要复合过滤规则还会再次进入过滤器,再一次的条件注意要与请求转发的条件不同,避免死循环。