利用HttpServletRequestWrapper对HttpServletRequest进行封装的方法
2012-11-13 15:17
579 查看
首先,说明几个类和方法的关系: 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中
InputStream inputStream = request.getInputStream();
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流
public ServletInputStream getInputStream ()
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;
}
}
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中
InputStream inputStream = request.getInputStream();
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流
public ServletInputStream getInputStream ()
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;
}
}
相关文章推荐
- 利用HttpServletRequestWrapper和filter改变request的getParameter方法
- SpringMVC上传图片总结(1)---常规方法进行图片上传,使用了MultipartFile、MultipartHttpServletRequest
- HttpServletRequestWrapper采用装饰模式重新封装request,并打印request请求相关参数。
- SpringMVC上传图片总结(1)---常规方法进行图片上传,使用了MultipartFile、MultipartHttpServletRequest
- SpringMVC上传图片总结(1)-Web Uploader--常规方法进行图片上传,使用了MultipartFile、MultipartHttpServletRequest
- SpringMVC上传图片总结(1)---常规方法进行图片上传,使用了MultipartFile、MultipartHttpServletRequest
- 在HttpServletRequest request获得参数,通过类的set方法封装到对象中
- SpringMVC上传图片总结(1)---常规方法进行图片上传,使用了MultipartFile、MultipartHttpServletRequest
- HttpClient与servlet进行通信两种方法
- HttpServletRequestWrapper作用
- HttpServletRequestWrapper的用法
- SpringMVC——使用RequestDispatcher.include()和HttpServletResponseWrapper动态获取jsp输出内容
- HttpServletRequest对象方法的用法 (转)
- HttpServletRequestWrapper作用
- HttpServletRequest常用获取URL的方法
- AJAX(XMLHttpRequest)进行跨域请求方法详解(一)
- AJAX(XMLHttpRequest)进行跨域请求方法详解(四)
- AJAX(XMLHttpRequest)进行跨域请求方法详解
- Ajax获取XmlHttpRequest对象的方法,兼容IE、火狐。用来与服务器进行通信。
- HttpServletRequestWrapper 用法