您的位置:首页 > 理论基础 > 计算机网络

利用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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐