为了解决每次get或者post方式提交数据的时候,编码解码方式不同导致乱码的问题,直接在过滤器中自动过滤
新建过滤器Filter
public class GlobalDecodeFilter implements Filter
{
@Override
public void destroy()
{
}
@Override
public void doFilter(ServletRequest req, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest) req;
//**告诉浏览器编码方式**
response.setContentType("text/html;charset=utf-8");
//过滤post方式提交的数据 POST一定要大写
if (request.getMethod().equals("POST"))
{
request.setCharacterEncoding("utf-8");//请求数据的编码
filterChain.doFilter(request, response);
}else
{
//过滤get方式提交的数据,先用iso-8859-1解码(包装一下)
HttpServletRequest request2 = new MyRequest((HttpServletRequest) request);
filterChain.doFilter(request2, response);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
}
}
新建包装类,处理get方式的request
//包装类 重写3个API,过滤参数的value值
class MyRequest extends HttpServletRequestWrapper
{
@Override
public String getParameter(String name)
{
String param = super.getParameter(name);
String key = null;
try
{
if (param !=null)
{
byte[] bytes = param.getBytes("iso-8859-1");
key = new String(bytes, "utf-8");
}
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
return key;
}
@Override
public Map<String, String[]> getParameterMap()
{
//Map
Map<String , String[]> permeterMap = super.getParameterMap();
//取出map中的映射关系
Set<Entry<String, String[]>> entrySet = permeterMap.entrySet();
//遍历entrySet 取出键值对
for (Entry<String, String[]> entry : entrySet)
{
String[] values = entry.getValue();
for (String string : values)
{
try
{
//逐个遍历key的valu值,立即解码
byte[] bytes = string.getBytes("ISO-8859-1");
string = new String(bytes, "utf-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
}
System.out.println("map解码");
return permeterMap;
}
@Override
public String[] getParameterValues(String name)
{
//数组
//拿到包含参数的key和value的map
Map<String, String[]> permeterMap = getParameterMap();
//通过传进来的key拿到参数值数组(checkbox)
String[] strings = permeterMap.get(name);
return strings;
}
public MyRequest(HttpServletRequest request)
{
super(request);
}
web.xml中定义一个过滤器,注意filter定义一定要按提示顺序来,写在servlet前,否则报错
<filter-mapping>
<filter-name>LoginServlet</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>globladecoder</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>