文档章节

包装ServletRequest和ServletResponse

peanutmain
 peanutmain
发布于 2015/07/03 16:40
字数 446
阅读 86
收藏 0

为什么要记录Request Body

  在做测试(这里主要是指的App端,网页端直接firebug即可)的时候,在接口测试错误出现Bug的时候,方便定位错误。

  封装ServletRequest

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;

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

public class RequestWrapper extends HttpServletRequestWrapper {

	private final byte[] buffer;

	private ServletInputStream sis;

	private BufferedReader reader;

	public byte[] getBuffer() {
		return buffer;
	}

	public RequestWrapper(HttpServletRequest request) throws IOException {
		super(request);
		final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		copyStream(request.getInputStream(), byteArrayOutputStream);
		buffer = byteArrayOutputStream.toByteArray();
	}

	@Override
	public BufferedReader getReader() throws IOException {
		if (reader == null) {
			String characterEncoding = this.getCharacterEncoding();
			if (characterEncoding == null) {
				reader = new BufferedReader(new InputStreamReader(
						this.getInputStream()));
			} else {
				reader = new BufferedReader(new InputStreamReader(
						this.getInputStream(), characterEncoding));
			}
		}
		return reader;
	}

	@Override
	public ServletInputStream getInputStream() throws IOException {
		if (sis == null) {
			final ByteArrayInputStream bais = new ByteArrayInputStream(buffer);
			sis = new ServletInputStream() {
				@Override
				public int read() throws IOException {
					return bais.read();
				}
			};
		}
		return sis;
	}

	private void copyStream(InputStream input, OutputStream output)
			throws IOException {
		final byte[] bytes = new byte[1024];
		int length;
		while ((length = input.read(bytes)) != -1) {
			output.write(bytes, 0, length);
		}
	}
	
	public String doGetRequestBody() {
		return new String(buffer);
	}
}



java.io.EOFException: No content to map to Object due to end of input



java.lang.IllegalStateException: getReader() has already been called for this request



封装ServletResponse

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class ResponseWrapper extends HttpServletResponseWrapper {

	private ByteArrayOutputStream buffer = null;
	private ServletOutputStream out = null;
	private PrintWriter writer = null;

	public ResponseWrapper(HttpServletResponse resp) throws IOException {
		super(resp);
		buffer = new ByteArrayOutputStream();// 真正存储数据的流
		out = new WapperedOutputStream(buffer);
		writer = new PrintWriter(new OutputStreamWriter(buffer,
				this.getCharacterEncoding()));
	}

	// 重载父类获取outputstream的方法
	@Override
	public ServletOutputStream getOutputStream() throws IOException {
		return out;
	}

	// 重载父类获取writer的方法
	@Override
	public PrintWriter getWriter() throws UnsupportedEncodingException {
		return writer;
	}

	// 重载父类获取flushBuffer的方法
	@Override
	public void flushBuffer() throws IOException {
		if (out != null) {
			out.flush();
		}
		if (writer != null) {
			writer.flush();
		}
	}

	@Override
	public void reset() {
		buffer.reset();
	}

	public String getContent() throws IOException {
		flushBuffer();// 将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据
		return new String(buffer.toByteArray());
	}

	// 内部类,对ServletOutputStream进行包装
	private class WapperedOutputStream extends ServletOutputStream {
		private ByteArrayOutputStream bos = null;

		public WapperedOutputStream(ByteArrayOutputStream stream)
				throws IOException {
			bos = stream;
		}

		@Override
		public void write(int b) throws IOException {
			bos.write(b);
		}
	}
}



© 著作权归作者所有

上一篇: 面试小记1
下一篇: 初始lucene
peanutmain

peanutmain

粉丝 13
博文 21
码字总数 12061
作品 0
成都
程序员
私信 提问
shiro的代理过滤器

在配置shiro的时候第一件事情就是在web.xml文件中配置一个由spring提供的类:org.springframework.web.filter.DelegatingFilterProxy按照字面的翻译这应该是一个代理过滤器的策略。 这个类其...

hyssop
2016/07/18
98
0
springboot的shiro配置之过滤器

springboot整合shiro的文章到处都是。包括springboot的官网都有相应的例子。但是这块有个注意点,需要那些从springmvc迁到springboot的朋友注意下。这个问题困扰我了两三天,今天分享出来让后...

hyssop
2016/11/21
451
0
Java Web 中对 ServletRequest 的一些非常规操作解决方案

前言 是我们搞 经常接触的 。有些时候我们要经常对其进行一些操作。这里列举一些经常的难点操作。 2. 提取 body 中的数据 前后端交互我们会在 中传递数据。我们如何从 中提取数据。通常我们会...

码农小胖哥
10/24
86
0
springmvc集成shiro后,session、request姓汪还是姓蒋?

疑问 我们在项目中使用了spring mvc作为MVC框架,shiro作为权限控制框架,在使用过程中慢慢地产生了下面几个疑惑,本篇文章将会带着疑问慢慢地解析shiro源码,从而解开心里面的那点小纠纠。 ...

细肉云吞
2017/06/18
6.6K
22
org.jasig.cas.client校验

AbstractTicketValidationFilter org.jasig.cas.client.validation.AbstractTicketValidationFilter AuthenticationFilter org.jasig.cas.client.authentication.AuthenticationFilter filte......

go4it
2016/10/26
47
0

没有更多内容

加载失败,请刷新页面

加载更多

006-Docker中导出单个或多个tar包

docker中导出单个镜像和多个镜像的tar包 docker save [images] > [name.tar] docker save [images] [images] > [name.tar]...

伟大源于勇敢的开始
今天
6
0
Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
今天
4
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
今天
4
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
6
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部