SpringMVC過濾器攔截參數,將參數前後空格去掉,支持GET中的URL參數和POST請求的Json格式參數

 1.這是過濾的方法:


import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
/**
 * 過濾請求參數前後空格
 * 
 * @author XiangGuoShuai
 * @Date 2020年6月20日
 *
 */
public class ParameterRequestWrapper {

	/**
	 * 過濾JSON數據請求參數前後空格
	 * @param request
	 * @param requestWrapper
	 */
	@SuppressWarnings("unchecked")
	public ServletRequest parameterRequest(HttpServletRequest request, ServletResponse response) throws IOException {

		RepeatedlyRequestWrapper requestWrapper = new RepeatedlyRequestWrapper(request, response);
		
		new ParameterRequestWrapper().parameterGetRequest(request,requestWrapper);
		// 讀取請求內容
		BufferedReader br;
		br = requestWrapper.getReader();
		String line = null;
		StringBuilder sb = new StringBuilder();
		while ((line = br.readLine()) != null) {
			sb.append(line);
		}
		
		JSONObject jsonObject = JSONObject.parseObject(sb.toString());
		Map<String, Object> map = new HashMap<String, Object>();
		map = JSON.toJavaObject(jsonObject, Map.class);
		
		if(null != map) {
			for (Entry<String, Object> entry : map.entrySet()) {
				// 刪除參數前後空格
				map.put(entry.getKey(), entry.getValue().toString().trim());
			}
			// 把參數轉換之後放到我們的body裏面
			String json = JSON.toJSONString(map);
			requestWrapper.setBody(json.getBytes("UTF-8"));
		}
		 return requestWrapper;

	}
	/**
	 * 過濾URL請求參數前後空格
	 * @param request
	 * @param requestWrapper
	 */
	public void  parameterGetRequest(HttpServletRequest request, RepeatedlyRequestWrapper requestWrapper){
		
		 Map<String, String[]> parameterMap = request.getParameterMap();
		 Map<String, String[]> parames = new HashMap<String, String[]>();
		 if(null != parameterMap) {
			 Set<String> set =parameterMap.keySet();
		        Iterator<String> it=set.iterator();
		        while(it.hasNext()){
		            String key= (String) it.next();
		            String[] values = parameterMap.get(key);
		            values[0] = values[0].trim();
		            parames.put(key, values);
		        }
		        requestWrapper.setParams(parames);
		 }
	}
	
}

​

2.繼承HttpServletRequestWrapper類,參數存放回寫的方法


import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import com.miguan.station.tools.http.HttpHelper;

public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {

	private Map<String , String[]> params = new HashMap<String, String[]>();
    private  byte[] body;

    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException{
        super(request);
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        body = HttpHelper.getBodyString(request).getBytes("UTF-8");
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {

        final ByteArrayInputStream bais = new ByteArrayInputStream(body);

        return new ServletInputStream() {

            @Override
            public int read() throws IOException {
                return bais.read();
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }
        };

    }
    
    //重寫getParameter 參數從當前類中的map獲取
    @Override
    public String[] getParameterValues(String name) {
        return params.get(name);
    }
    
	public byte[] getBody() {
		return body;
	}

	public void setBody(byte[] body) {
		this.body = body;
	}

	public void setParams(Map<String, String[]> params) {
		this.params = params;
	}
	
	 
}

3.加入過濾器,調用第一步的類,放進doFilter,OK。。。。

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;
import com.miguan.station.api.filter.wrapper.ParameterRequestWrapper;
import com.miguan.station.api.filter.wrapper.RepeatedlyRequestWrapper;

/**
 * Repeatable 過濾器
 */
public class RepeatableFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		String contentType = request.getContentType();
		ServletRequest requestWrapper = null;

		// 如果上傳的是文件(multipart/form-data),就不走過濾
		if (request instanceof HttpServletRequest) {
			if (null != contentType && contentType.contains("multipart/form-data")) {
				return;
			}else {
				requestWrapper = new ParameterRequestWrapper().parameterRequest((HttpServletRequest) request, response);
			}
		}


		if (null == requestWrapper) {
			chain.doFilter(request, response);
		} else {
			chain.doFilter(requestWrapper, response);
		}
	}

	@Override
	public void destroy() {

	}
}

別玩了個web.xml配置Filter監聽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章