在ssh使用了过滤器后,
在doPost里面,无法执行getInputStream 或者 getReader
原因是流被SSH框架读取过了。解决办法要么改成Get方式,要么对目标请求的Servlet建立一个新的过滤器,在过滤器中,重新生成一个可读取的数据流并继续处理。
【http://ayaoxinchao.iteye.com/blog/2110902】
新过滤器
- /**
- * @author Perlin.Yao
- * @date 2014年8月22日
- * @version 1.0
- */
- public class HttpServletRequestReplacedFilter implements Filter {
- @Override
- public void destroy() {
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- ServletRequest requestWrapper = null;
- if(request instanceof HttpServletRequest) {
- requestWrapper = new MAPIHttpServletRequestWrapper((HttpServletRequest) request);
- }
- if(requestWrapper == null) {
- chain.doFilter(request, response);
- } else {
- chain.doFilter(requestWrapper, response);
- }
- }
- @Override
- public void init(FilterConfig arg0) throws ServletException {
- }
- }
对应的web.xml
- <filter>
- <filter-name>requestFilter</filter-name>
- <filter-class>com.ulinkpay.mapi.common.web.HttpServletRequestReplacedFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>requestFilter</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
MAPIHttpServletRequestWrapper类
- public class MAPIHttpServletRequestWrapper extends HttpServletRequestWrapper {
- private final byte[] body; // 报文
- public MAPIHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
- super(request);
- body = StreamUtil.readBytes(request.getInputStream());
- }
- @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();
- }
- };
- }
- }
上图中的这里是关键了: