添加特殊字符过滤器后台有中文乱码的问题

在一个修复特殊字符过滤的问题中,添加了一个如下过滤器, 后台收到的中文出现了乱码.

import java.io.IOException;

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;

public class XssFilter implements Filter{

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

    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest request = (HttpServletRequest)req;
        XssWrapper wrapRequest= new XssWrapper(request);
        chain.doFilter(wrapRequest, res);

    }

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

}
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class XssWrapper extends HttpServletRequestWrapper {

    private HttpServletRequest request;
    private boolean flag=true;
     
    public XssWrapper(HttpServletRequest request) {
             super(request);
             this.request = request;

   }

public Map getParameterMap() {
          return super.getParameterMap();
   }

    public Enumeration getParameterNames() {
             Map params = getParameterMap();
             Vector l = new Vector( params.keySet());
             return l.elements();
   }

    public String[] getParameterValues(String name) {
            Map params = getParameterMap();
            Object v = params.get(name);
             if (v == null ) {
                       return null ;
            } else if (v instanceof String[]) {
                      String[] value = (String[]) v;
                       for (int i = 0; i < value.length; i++) {
                               value[i] = value[i].replaceAll( "<", "<" );
                               value[i] = value[i].replaceAll( ">", ">" );
                      }
                       return (String[]) value;
            } else if (v instanceof String) {
                      String value = (String) v;
                      value = value.replaceAll( "<", "<" );
                      value = value.replaceAll( ">", ">" );
                       return new String[] { (String) value };
            } else {
                       return new String[] { v.toString() };
            }
   }

    public String getParameter(String name) {
            Map params = getParameterMap();
            Object v = params.get(name);
             if (v == null ) {
                       return null ;
            } else if (v instanceof String[]) {
                      String[] strArr = (String[]) v;
                       if (strArr.length > 0) {
                               String value = strArr[0];
                               value = value.replaceAll( "<", "<" );
                               value = value.replaceAll( "<", ">" );
                                return value;
                      } else {
                                return null ;
                      }
            } else if (v instanceof String) {
                      String value = (String) v;
                      value = value.replaceAll( "<", "<" );
                      value = value.replaceAll( ">", ">" );
                       return (String) value;
            } else {
                       return v.toString();
            }
   }

只要在获取参数map的时候先进行下转码就可以了.将上面类中的getParameterMap改写为如下:

//转换编码修复有中文乱码的问题   

public Map getParameterMap() {
        /**
         * 首先判断请求方式
         * 若为post  request.setchar...(utf-8)
         * 若为get 将map中的值遍历编码就可以了
         */
        String method = request.getMethod();
        if("post".equalsIgnoreCase(method)){
            try {
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else if("get".equalsIgnoreCase(method)){
            Map map = request.getParameterMap();
            //需要遍历map 修改value的每一个数据的编码
            if(flag){
                for (String key:map.keySet()) {
                    String[] arr = map.get(key);
                    //继续遍历数组
                    for(int i=0;i

 

你可能感兴趣的:(java,spring,web,过滤器,特殊字符,中文乱码,java)