流沙团
使用Filter 解决Servet的乱码问题
2016-7-31 流沙团


1\使用HttpServletRequestWrapper 包装类



2\重写getParameter \ getParameterValues \ getParameterMap 三个函数



3\ 配置 web.xml







核心过滤器代码







package com.gyarmy.demo4;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Set;

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;
import javax.servlet.http.HttpServletResponse;


public class UTFFilter implements Filter {

@Override
public void destroy() {
// TODO Auto-generated method stub

}

@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

// 要解决乱码 --- 能不能 自定义 一个包装类, 去包装这个 request 对象,

MyHttpServletRequestWrapper myrequest = new MyHttpServletRequestWrapper(request);
chain.doFilter(myrequest, response); //放行 , 目标资源会得到 执行

}

@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}

}


class MyHttpServletRequestWrapper extends HttpServletRequestWrapper{

private HttpServletRequest request;

public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}

@Override
public String getParameter(String name) {

Map<String,String[]> map = getParameterMap();
//获得对应 values 数组
String[] values = map.get(name);

if(values!=null){

//返回数组的第一个元素
return values[0];
}
return null;
}

@Override
public String[] getParameterValues(String name) {
Map<String,String[]> map = getParameterMap();
//获得对应 values 数组
String[] values = map.get(name);
return values;
}

//默认的是false, 表示没有 被 解码 过
private boolean hasBeenEncoded= false;

@Override
public Map getParameterMap() {

//只有 get 和post

//获得请求 方式
String method = request.getMethod();

if("post".equalsIgnoreCase(method)){

//如果 进来,表示 是post请求方式

try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}else{

//说明是get

//拿到 现有的乱码的 map
Map<String,String[]> map = request.getParameterMap();

//遍历 map
Set<String> keys = map.keySet();

// 乱码的本质 原因是, 这里 的 for 循环里的逻辑 被重复的调用了, 正常的情况下, 应该是只 调用一次, 就会解决乱码
// 如何确保这里 的for循环里的 代码 只被 调用一次


//这里 定义 布尔值, 实现 代码 只被 调用一次, 是实际开发过程中,非常 常用的. (技巧性的代码)
if(!hasBeenEncoded){
hasBeenEncoded = true;

for (String key : keys) {
//乱码的
String[] values = map.get(key);
for (int i = 0; i < values.length; i++) {

try {
System.out.println("之前: " + values[i]);
values[i] = new String(values[i].getBytes("ISO8859-1"),"UTF-8");
System.out.println("之后: " + values[i]);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
return map;
}
return super.getParameterMap();
}

}













发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容