全局编码过滤器

这个是之前做的一个项目时,遇到请求回来的中文有乱码的问题,通过这个全局编码过滤器,不论是post请求还是get请求,乱码问题都可以解决

  1 import java.io.IOException;
  2 
  3 import java.io.UnsupportedEncodingException;
  4 import java.util.Map;
  5 
  6 import javax.servlet.Filter;
  7 import javax.servlet.FilterChain;
  8 import javax.servlet.FilterConfig;
  9 import javax.servlet.ServletException;
 10 import javax.servlet.ServletRequest;
 11 import javax.servlet.ServletResponse;
 12 import javax.servlet.http.HttpServletRequest;
 13 import javax.servlet.http.HttpServletRequestWrapper;
 14 
 15 /**
 16 * 通用解决 get 和 post乱码过滤器
 17 * 
 18 * 
 19 * 
 20 */
 21 public class EncodingFilter implements Filter {
 22 
 23 @Override
 24 public void destroy() {
 25 }
 26 
 27 @Override
 28 public void doFilter(ServletRequest request, ServletResponse response,
 29 FilterChain chain) throws IOException, ServletException {
 30 // 处理请求乱码
 31 HttpServletRequest httpServletRequest = (HttpServletRequest) request;
 32 HttpServletRequest myRequest = new MyRequest(httpServletRequest);
 33 
 34 // 处理响应乱码
 35 response.setContentType("text/html;charset=utf-8");
 36 
 37 chain.doFilter(myRequest, response);
 38 }
 39 
 40 @Override
 41 public void init(FilterConfig filterConfig) throws ServletException {
 42 }
 43 
 44 }
 45 
 46 // 自定义request对象
 47 class MyRequest extends HttpServletRequestWrapper {
 48 
 49 private HttpServletRequest request;
 50 
 51 private boolean hasEncode;
 52 
 53 public MyRequest(HttpServletRequest request) {
 54 super(request);// super必须写
 55 this.request = request;
 56 }
 57 
 58 // 对需要增强方法 进行覆盖
 59 @Override
 60 public Map getParameterMap() {
 61 // 先获得请求方式
 62 String method = request.getMethod();
 63 if (method.equalsIgnoreCase("post")) {
 64 // post请求
 65 try {
 66 // 处理post乱码
 67 request.setCharacterEncoding("utf-8");
 68 return request.getParameterMap();
 69 } catch (UnsupportedEncodingException e) {
 70 e.printStackTrace();
 71 }
 72 } else if (method.equalsIgnoreCase("get")) {
 73 // get请求
 74 Map<String, String[]> parameterMap = request.getParameterMap();
 75 if (!hasEncode) { // 确保get手动编码逻辑只运行一次
 76 for (String parameterName : parameterMap.keySet()) {
 77 String[] values = parameterMap.get(parameterName);
 78 if (values != null) {
 79 for (int i = 0; i < values.length; i++) {
 80 try {
 81 // 处理get乱码
 82 values[i] = new String(values[i]
 83 .getBytes("ISO-8859-1"), "utf-8");
 84 } catch (UnsupportedEncodingException e) {
 85 e.printStackTrace();
 86 }
 87 }
 88 }
 89 }
 90 hasEncode = true;
 91 }
 92 return parameterMap;
 93 }
 94 
 95 return super.getParameterMap();
 96 }
 97 
 98 @Override
 99 public String getParameter(String name) {
100 Map<String, String[]> parameterMap = getParameterMap();
101 String[] values = parameterMap.get(name);
102 if (values == null) {
103 return null;
104 }
105 return values[0]; // 取回参数的第一个值
106 }
107 
108 @Override
109 public String[] getParameterValues(String name) {
110 Map<String, String[]> parameterMap = getParameterMap();
111 String[] values = parameterMap.get(name);
112 return values;
113 }
114 
115 }

 

posted @ 2017-11-11 22:52  Nevada  阅读(118)  评论(0)    收藏  举报