基于spring mvc 过滤器处理前端请求的字段值2端空白

在使用spring mvc时, 常见请求类型
form表单: contentType:application/x-www-form-urlencoded
json数据: contentType:application/json
单个参数: contentType:application/text

第1,2种使用对象接收 , 第3种使用基本类型接收

不可避免的用户会输入些空白字符, 要么前端要么后端进行trim操作.
使用过滤器统一处理字段值2端空白字符. json类型也能处理.
很懒直接上代码.

package com.httx.btb.common.web.filter;

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

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

/**
*param参数去除空格并写回
*
*@ClassName: ParameterRequestWrapper
*@author yechao
*@date 2017年9月5日 下午12:35:03
*@Description: TODO
*/
public class ParameterRequestWrapper extends HttpServletRequestWrapper {

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

private ServletInputStream sis = null;

/*
 * 获得输入流
 * json数据
 * @see javax.servlet.ServletRequestWrapper#getInputStream()
 */
@Override
public ServletInputStream getInputStream() throws IOException {
	if (this.sis != null) {
		return this.sis;
	}
	return super.getInputStream();
}

/*
 * @当使用?a=1&b=2请求时 (non-Javadoc)
 * 
 * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
 */
@Override
public String getParameter(String name) {
	String[] values = params.get(name);
	if (values == null || values.length == 0) {
		return null;
	}
	return values[0];
}

/*
 * (non-Javadoc)
 * 
 * @see
 * javax.servlet.ServletRequestWrapper#getParameterValues(java.lang.String)
 */
@Override
public String[] getParameterValues(String name) {
	return params.get(name);
}

public ParameterRequestWrapper(HttpServletRequest request) {
	super(request);
	// 将参数表,赋予给当前的Map以便于持有request中的参数
	this.params.putAll(request.getParameterMap());
	this.modifyParameterValues();

	String contentType = request.getContentType();
	if (contentType == null || !contentType.contains("application/json")) {
		return;
	}
	try {
		if (request.getInputStream() != null) {
			this.sis = replaceInputStream(request.getInputStream());
		}
	} catch (IOException e) {
		e.printStackTrace();
	}
}

/**
 * 重载一个构造方法
 * 
 * @param request
 * @param extendParams
 */
public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
	this(request);
	addAllParameters(extendParams);// 这里将扩展参数写入参数表
}

public ServletInputStream replaceInputStream(ServletInputStream oldSis) {
	BufferedReader br = null;

	try {
		br = new BufferedReader(new InputStreamReader(oldSis));

		StringBuffer sb = new StringBuffer();
		String line = null;
		while ((line = br.readLine()) != null) {
			sb.append(line);
		}
		String body = sb.toString();
		if (!body.isEmpty()) { 
			//处理json数据字段值2端的空白			
			body = body.replaceAll("\\s+(?=\",)", "");// 断言后面能匹配到",
			body = body.replaceAll("(?<=\":\")\\s+", ""); // 断言前面能匹配到 :"
		}
		byte[] myBytes = body.getBytes();
		ServletInputStream sis = new ServletInputStream() {

			private int lastIndexRetrieved = -1;
			private ReadListener readListener = null;

			@Override
			public boolean isFinished() {
				return (lastIndexRetrieved == myBytes.length - 1);
			}

			@Override
			public boolean isReady() {
				// This implementation will never block
				// We also never need to call the readListener from this
				// method, as this method will never return
				// false
				return isFinished();
			}

			@Override
			public void setReadListener(ReadListener readListener) {
				this.readListener = readListener;
				if (!isFinished()) {
					try {
						readListener.onDataAvailable();
					} catch (IOException e) {
						readListener.onError(e);
					}
				} else {
					try {
						readListener.onAllDataRead();
					} catch (IOException e) {
						readListener.onError(e);
					}
				}
			}

			@Override
			public int read() throws IOException {
				int i;
				if (!isFinished()) {
					i = myBytes[lastIndexRetrieved + 1];
					lastIndexRetrieved++;
					if (isFinished() && (readListener != null)) {
						try {
							readListener.onAllDataRead();
						} catch (IOException ex) {
							readListener.onError(ex);
							throw ex;
						}
					}
					return i;
				} else {
					return -1;
				}
			}
		};
		return sis;
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if (br != null) {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	return null;
}

/**
 * 将parameter的值去除空格后重写回去
 */
public void modifyParameterValues() {
	Set<String> set = params.keySet();
	Iterator<String> it = set.iterator();
	while (it.hasNext()) {
		String key = (String) it.next();
		String[] values = params.get(key);
		for (int i = 0; i < values.length; i++) {
			if (values[i] == null) {
				continue;
			}
			values[i] = values[i].trim();
		}
		params.put(key, values);
	}
}

/**
 * 增加多个参数
 * 
 * @param otherParams
 */
public void addAllParameters(Map<String, Object> otherParams) {
	for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
		addParameter(entry.getKey(), entry.getValue());
	}
}

/**
 * 增加参数
 * 
 * @param name
 * @param value
 */
public void addParameter(String name, Object value) {
	if (value != null) {
		if (value instanceof String[]) {
			params.put(name, (String[]) value);
		} else if (value instanceof String) {
			params.put(name, new String[] { (String) value });
		} else {
			params.put(name, new String[] { String.valueOf(value) });
		}
	}
}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值