通过反射读取HttpServletResponse输出至客户端的流

这几天在学Spring MVC,于是也学了点Spring拦截器。本来想通过拦截器截取response对象中用户登录成功与否的状态。但发现response对象只做输出,所以得不到里面的值。于是就各种百度、GOOGLE。发现大多的方法都是放在Controller被调用之前,那样的确不错,但那样不符合我现在的情况。我需要的是仅仅在Controller调用之后。

然后自己调试了~~~发现应该很好取的。。没有网上讲的那么麻烦

直接看怎么做吧。。

CoyoteOutputStream os = (CoyoteOutputStream) response.getOutputStream();


先给出一个完整的代码

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.connector.CoyoteOutputStream;
import org.apache.catalina.connector.OutputBuffer;
import org.apache.tomcat.util.buf.ByteChunk;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class SecurityInterceptor implements HandlerInterceptor {

	/**
	 * 方法执行成功之后回调的方法
	 */
	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object obj, Exception exception)
			throws Exception {
		// 截取响应流
		CoyoteOutputStream os = (CoyoteOutputStream) response.getOutputStream();
		// 取到流对象对应的Class对象
		Class<CoyoteOutputStream> c = CoyoteOutputStream.class;
		// 取出流对象中的OutputBuffer对象,该对象记录响应到客户端的内容
		Field fs = c.getDeclaredField("ob");
		if (fs.getType().toString().endsWith("OutputBuffer")) {
			fs.setAccessible(true);// 设置访问ob属性的权限
			OutputBuffer ob = (OutputBuffer) fs.get(os);// 取出ob
			Class<OutputBuffer> cc = OutputBuffer.class;
			Field ff = cc.getDeclaredField("outputChunk");// 取到OutputBuffer中的输出流
			ff.setAccessible(true);
			if (ff.getType().toString().endsWith("ByteChunk")) {
				ByteChunk bc = (ByteChunk) ff.get(ob);// 取到byte流

				String val = new String(bc.getBytes(), "UTF-8");// 最终的值
				System.out.println(val);
			}
		}
	}

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object obj, ModelAndView mav)
			throws Exception {
	}

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object obj) throws Exception {
		return true;
	}

}


附:

要用到Tomcat中的包,我在Tomcat6.x中的libs目录找的。

tomcat-coyote.jar

catalina.jar


点击查看:org.apache.catalina.connector.CoyoteOutputStream

点击查看:org.apache.catalina.connector.OutputBuffer




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值