通过反射读取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




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 我可以给你一些有关读取和修改HttpServletResponse的建议。你可以使用HttpServletResponse的getInputStream()方法来获取,然后使用InputStream的read()方法来读取的数据,然后使用OutputStream的write()方法来修改的数据。最后,使用HttpServletResponse的getOutputStream()方法来将修改后的数据写入。 ### 回答2: 要读取HttpServletResponse并进行修改,可以按照以下步骤进行: 1. 首先,获取HttpServletResponse对象,可以使用Servlet的doGet()或doPost()方法的参数response参数,或者通过getRespone()方法获取。 2. 通过response对象的getOutputStream()方法获取输出对象OutputStream,用于向客户端发送数据。 3. 使用合适的输入(FileInputStream、BufferedReader等)获取要修改的数据源,可以是文件、数据库、或者其他适当的数据来源。 4. 通过输入读取数据,并进行相应的修改操作。可以使用Java IO或者其他适当的工具类进行处理。 5. 使用输出将修改后的数据发送给客户端。可以使用OutputStream的write()方法将数据写入输出。 6. 最后,记得关闭输入输出,释放资源。 以下是一个简单的示例代码: ``` protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取输出对象 OutputStream outputStream = response.getOutputStream(); // 获取要修改的数据源 FileInputStream inputFile = new FileInputStream("data.txt"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputFile)); // 读取数据,并进行修改操作 String line; StringBuilder modifiedData = new StringBuilder(); while ((line = bufferedReader.readLine()) != null) { // 对数据进行修改,这里仅作示例 String modifiedLine = line.toUpperCase(); // 将修改后的数据添加到结果字符串 modifiedData.append(modifiedLine).append("\n"); } // 向客户端发送修改后的数据 outputStream.write(modifiedData.toString().getBytes()); // 关闭输入输出 bufferedReader.close(); inputFile.close(); } ``` 请根据具体情况适当修改和调整代码,以满足自己的需求。 ### 回答3: 要读取HttpServletResponse并进行修改,可以按照以下步骤进行操作: 1. 首先,通过HttpServletResponse获取OutputStream对象,该对象用于将数据写入响应。可以使用`httpServletResponse.getOutputStream()`方法获取OutputStream对象。 2. 接下来,可以将OutputStream对象封装为BufferedOutputStream,以提供更高效的写入操作。可以使用`new BufferedOutputStream(httpServletResponse.getOutputStream())`进行封装。 3. 通过BufferedOutputStream对象,可以将需要修改的内容写入响应。可以使用`bufferedOutputStream.write()`方法进行写入操作。例如,可以将字符串写入响应:`bufferedOutputStream.write("修改后的内容".getBytes("UTF-8"))`。 4. 在修改完成后,需要关闭BufferedOutputStream对象,确保数据被正确写入响应。可以使用`bufferedOutputStream.close()`方法进行关闭操作。 需要注意的是,在对HttpServletResponse进行读取和修改时,应确保在调用以上方法之前,不要对HttpServletResponse进行任何其他写入操作,否则可能会引发异常。另外,根据业务需求,还可以设置响应头信息、状态码等内容。 以上就是读取HttpServletResponse并进行修改的简要步骤。具体实现时,还需要考虑其他细节和异常处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值