过滤器(解决中文乱码get/post)

过滤器(解决中文乱码get/post)

Filter

必须在web.xml中注册

作用:在请求和响应之间进行拦截数据,对数据进行加工处理。

原理:请求à过滤器1(doFilter)à过滤器2à 处理  à过滤器2à过滤器1à响应

多个过滤器组成的叫做过“滤器链”。

编写:(分析一下生命周期)

1.      让一个类实现Filter接口

2.      重写里面的方法,最重要的是doFilter方法

3.      在web.xml注册



生命周期

中文乱乱处理:

 post提交中文乱码:

 全局post提交中文乱码过滤器

 get提交中文乱码:

主要利用:

在过滤器中:我们继承HttpServletRequestWrapper类,通过重写里面的方法来达到目的:





完整过滤器代码如下:

package com.crm.web.filter;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

import java.util.Map.Entry;

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 MyFilter implements Filter {

         @Override

         public void destroy() {

                   System.out.println("过滤器销毁.......");

         }

         @Override

         public void doFilter(ServletRequest request, ServletResponse response,

                            FilterChain chain) throws IOException, ServletException {

                   System.out.println("进行过滤器开发.......");

                   // 只要在这里加

                   request.setCharacterEncoding("utf-8");// 请求

                   response.setCharacterEncoding("utf-8");// 响应

                   response.setContentType("text/html;charset=utf-8");// 响应

                   // get提交乱码处理

                   chain.doFilter(new MyRequest((HttpServletRequest) request), response);

         }

         @Override

         public void init(FilterConfig filterConfig) throws ServletException {

                   System.out.println("过滤器初始化.......");

         }

         class MyRequest extends HttpServletRequestWrapper {

                   HttpServletRequest request;

                   public MyRequest(HttpServletRequest request) {

                            super(request);

                            this.request = request;

                   }

                   @Override

                   public String getParameter(String name) {

                            String value = request.getParameter(name);

                            // 先判断是否为空

                            if (value == null) {

                                     return null;

                            }

                            // 再判断提交方法

                            if (!request.getMethod().equals("GET")) {

                                     return value;

                            }

                            // get提交

                            try {

                                     value = new String(value.getBytes("iso8859-1"), "utf-8");

                            } catch (UnsupportedEncodingException e) {

                                     // TODO Auto-generated catch block

                                     e.printStackTrace();

                            }

                            return value;

                   }

                   @Override

                   public String[] getParameterValues(String name) {

                            String[] oldValues = request.getParameterValues(name);

                            String[] newValues = null;

                            if (oldValues != null) {

                                     newValues = new String[oldValues.length];

                                     if (!request.getMethod().equals("GET")) {

                                               return oldValues;

                                     }

                                     if (newValues != null) {

                                               try {

                                                        for (int i = 0; i < oldValues.length; i++) {

                                                                 String value = oldValues[i];

                                                                 value = new String(value.getBytes("iso8859-1"),

                                                                                    "utf-8");

                                                                 newValues[i] = value;

                                                        }

                                               } catch (UnsupportedEncodingException e) {

                                                        // TODO Auto-generated catch block

                                                        e.printStackTrace();

                                               }

                                     }

                            }

                            return newValues;

                   }

                   @Override

                   public Map<String, String[]> getParameterMap() {

                            // 1.拿到客户端的值

                            Map<String, String[]> oldMap = request.getParameterMap();

                            // 2.新map

                            Map<String, String[]> newMap = new HashMap<String, String[]>();

                            // 3.拿出oldMap

                            Set<Entry<String, String[]>> entrySet = oldMap.entrySet();

                            for (Entry<String, String[]> entry : entrySet) {

                                     // 4.获取键

                                     String key = entry.getKey();

                                     // 5.获取值

                                     String[] values = entry.getValue();

                                     // 新的数组和原数组一样大

                                     String[] newValues = new String[values.length];

                                     // 6.判断值是否为空

                                     if (values == null) {

                                               newMap.put(key, new String[] {});// 初始化

                                               continue;

                                     }

                                     // 7.取出values里面每一个值进行转码

                                     try {

                                               for (int i = 0; i < values.length; i++) {

                                                        String value = values[i];

                                                        value = new String(value.getBytes("iso8859-1"), "utf-8");

                                                        // value = new String(value.getBytes("iso8859-1"),

                                                        // request.getCharacterEncoding());

                                                        newValues[i] = value;

                                               }

                                               newMap.put(key, newValues);

                                     } catch (UnsupportedEncodingException e) {

                                               // TODO Auto-generated catch block

                                              e.printStackTrace();

                                     }

                            }

                            return newMap;

                   }

         }

}


猜你喜欢

转载自blog.csdn.net/mtm001/article/details/81000900