解决思路:
使用适配器模式对产生乱码的方法进行增强
1、filter中将request转换成增强后有request
package cn.itcast.crm.web.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
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;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 通用编码解决方案
*
*/
public class EncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 转型为与协议相关对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 对request包装增强
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
2、使用适配器模式自定义的增强的request类
// 自定义的增强request类
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
private boolean hasEncode;
public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}
// 对需要增强的方法进行覆盖
@Override
public Map getParameterMap() {
// 先获得请求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post请求
try {
// 处理post乱码
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {//tomcat8.5已经处理了get中文可以将get中的代码注释掉
// get请求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 确保get手动编码逻辑只运行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 处理get乱码
values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}
}
3、web.xml中将filter的url-patten配置成全局/*
<filter>
<filter-name>EncondeFilter</filter-name>
<filter-class>web.EncondeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncondeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4、另一种增强request的方式
package com.thw.web.filter;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.catalina.util.ParameterMap;
public class EnhancedRequest extends HttpServletRequestWrapper {
public EnhancedRequest(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
//重写需要增强的方法即可
@Override
public String getParameter(String name) {
//获得乱码
String luanma = this.getRequest().getParameter(name);
if(luanma!=null){//防止类似于checkbox不勾选的null值
String fluanma = null;
try {
fluanma = new String(luanma.getBytes("iso8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return fluanma;
}else{
return luanma;
}
}
protected ParameterMap<String, String[]> parameterMap = new ParameterMap<String, String[]>();
@Override
public Map<String, String[]> getParameterMap() {
//重写了底层的getParameterMap的业务逻辑,目的是调的getParameterValues方法是我重写的解决中文乱码问题的该方法。
if (parameterMap.isLocked()) {
return parameterMap;
}
Enumeration<String> enumeration = getParameterNames();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement();
String[] values = getParameterValues(name);
parameterMap.put(name, values);
}
parameterMap.setLocked(true);
return parameterMap;
}
//getParameterMap是通过getParameterValues方法来往map填充值,因此把getParameterValues进行增强,
//那么getParameterMap得到的就是非乱码。
@Override
public String[] getParameterValues(String name) {
String[] values = this.getRequest().getParameterValues(name);
String[] values_new = new String[values.length];
if(values!=null){
//values_new数组里存放的都是非乱码
for (int i = 0; i < values_new.length; i++) {
// values_new[i] = values[i]
if(values[i]!=null){//如果值不是空,才转码
try {
values_new[i] = new String(values[i].getBytes("iso8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
values_new[i] = values[i];
}
}
return values_new;
}else{
return values;
}
}
}