Spring拦截器读取响应OutputStream

时间:2017-08-16 14:53:47

标签: spring-mvc interceptor

内部spring控制器将excel流写入响应

set_include_path(get_include_path() . PATH_SEPARATOR . 'lib/phpseclib');
include('Net/SSH2.php');
include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->setPassword('my-pass-phrase');
$content = file_get_contents('key/private.ppk');
$rsa->loadKey($content);
$ssh = new Net_SSH2('host');
if (!$ssh->login('username', $rsa)) {
    exit('Login Failed');
}

根据此链接How to read and copy the HTTP servlet response output stream content for logging 实现了responsewrapper。 下面是拦截器代码,

     HSSFWorkbook workbook = getWorkbook();
     OutputStream out = response.getOutputStream();     
     response.setHeader("pragma", "public");
     response.setHeader("Cache-Control", "public");
     response.setContentType("application/vnd.ms-excel");      
     response.setHeader("Content-Disposition", "attachment;filename=sampleexcel.xls");      
     workbook.write(out);        
     out.close();
     // response.flushBuffer();

基本上想要将Outputstream内容读入临时文件。然后在其中添加加密信息。最后将此加密文件写入响应流。 在上面的代码中,resp.getCopy()为空,因此它将0字节写入临时文件。

任何指针有什么不对。有替代方法可以做到这一点。

Spring 3.1,JDK 1.7

1 个答案:

答案 0 :(得分:0)

Oups,一个spring-mvc拦截器不是过滤器。它提供了在控制器执行之前,控制器执行之后和视图生成之后调用的钩子,但不能替换响应。

引用帖子中使用的过滤器实际上用包装器替换响应,这样写入响应的所有内容实际上都会进入包装器并在写入时进行处理。这里你只有在写完一切后才创建包装器,所以它只能拦截......没有。

您必须实现过滤器和自定义响应包装器才能实现目标。

相关问题