首先,说明几个类和方法的关系: class HttpServletRequestWrapper
extends ServletRequestWrapper
implements HttpServletRequest
在Filter中由于需要的对于inputStream的内容进行权限验证,我们必须将所有input内容读取出来,但是在Controller层中程序同样需要提取input的内容,进而执行对应的post/put/delete请求,因此,我们在此对HttpServletRequest进行了封装,并对封装后的HttpServletRequestWrapper的getInputStream方法进行了重载,保证重载后的方法可以再次读取到inputStream中的所有内容。
package com.jeremyxu.xinterface.wrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.pptv.cloud.ppsync.common.exception.CloudRuntimeException;
import com.pptv.cloud.ppsync.common.util.StringUtils;
public class FilterRequestWrapper extends HttpServletRequestWrapper {
private static Logger log = LoggerFactory.getLogger(FilterRequestWrapper.class);
private final String payload;
private String encoding = null;
public FilterRequestWrapper (HttpServletRequest request) {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
String encoding = request.getCharacterEncoding();
try {
// read the payload into the StringBuilder
//按照正确的encoding,将inputStream中的内容写入到String中
if (inputStream != null) {
if (StringUtils.isEmpty(encoding)) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
} else {
this.encoding = encoding;
bufferedReader = new BufferedReader(new InputStreamReader(inputStream, encoding));
}
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
// make an empty string since there is no payload
stringBuilder.append("");
}
} catch (IOException ex) {
log.error("Error reading the request payload", ex);
throw new CloudRuntimeException("Error reading the request payload", ex);
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException iox) {
// ignore
}
}
}
payload = stringBuilder.toString();
}
public String getPayload() {
return this.payload;
}
@Override
重载getInputStream方法,获取ServletInputStream流
throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
StringUtils.isEmpty(encoding)? payload.getBytes() : payload.getBytes(encoding));
ServletInputStream inputStream = new ServletInputStream() {
public int read ()
throws IOException {
return byteArrayInputStream.read();
}
};
return inputStream;
}
}