我所有的控制器都扩展了以下抽象类:

public abstract class AbstractController {

    public HttpServletRequest request;
    public HttpServletResponse response;
    public ModelMap model;

}

此外,我实现了以下拦截器:

public class HttpRequestInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException {
        if (handler instanceof AbstractController) {
            AbstractController controller = (AbstractController) handler;
            controller.request = request;
            controller.response = response;
            controller.model = new ModelMap();
        }
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        if (handler instanceof AbstractController && modelAndView != null) {
            AbstractController controller = (AbstractController) handler;
            modelAndView.addAllObjects(controller.model);
        }
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

}

我发现这是一个解决方案,可以提高代码的分解效率,因为您无需在控制器内将requestresponsemodel作为方法参数进行传递。 该解决方案工作正常,直到我发现此问题:

public class HomeController extends AbstractController {

    @RequestMapping
    public void download1() {
        // use the parent attribute response
        File file = new File(MY_FILE_PATH);
        InputStream in = new BufferedInputStream(new FileInputStream(file));
        ServletOutputStream out = response.getOutputStream();
        IOUtils.copy(in, out);
        response.flushBuffer();
    }

    @RequestMapping
    public void download2(HttpServletResponse response) {
        // use the response passed as parameter
        File file = new File(MY_FILE_PATH);
        InputStream in = new BufferedInputStream(new FileInputStream(file));
        ServletOutputStream out = response.getOutputStream();
        IOUtils.copy(in, out);
        response.flushBuffer();
    }

}

上面的两种方法都使浏览器下载文件,但是download1生成了一个空文件,而download2则按原样生成了原始文件。 知道为什么吗?

由于调试器,我注意到的是,在postHandle拦截器的方法,所述download2方法生成modelAndView其等于null ,而download1一个生成的实例化一个。 这应该是解决问题的方法,但是我找不到。

作为控制器方法的参数传递时,如何获得实例化的response

#1楼 票数:7 已采纳

不要这样做:

public abstract class AbstractController {

    public HttpServletRequest request;
    public HttpServletResponse response;
    public ModelMap model;

}

控制器中的实例变量(其默认作用域为单例btw)不是一个好主意。

#2楼 票数:3

只需进行以下操作(到txt文件):

@RequestMapping(value="/download", method=RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ResponseBody
public String download(HttpServletResponse response) throws IOException {
    response.setContentType("application/force-download");
    FileReader fr = new FileReader("/folder/file.extension");
    return IOUtils.toString(fr); // IOUtils come from Apache Commons IO
}

  ask by sp00m translate from so

未解决问题?本站智能推荐:

1回复

设置一个过滤器,将响应头设置为仅图像文件

根据此链接中的讨论,我遇到了缓存问题 但是我不确定如何在Spring MVC上设置响应头的建议。 有谁知道如何设置某种过滤器来添加仅在图像文件上添加响应标头的过滤器? 我目前不是SPring MVC的J2EE Web开发专家。 任何想法?
1回复

如何使用PlayFramework2.2.x截取响应并修改响应主体?[关闭]

我需要拦截请求和响应。 我已经拦截了请求。 但是我不能用Java截取响应并获得响应主体。 我需要使用Java在Play Framework 2.2.x中拦截响应
2回复

Spring拦截器的实时使用有哪些?

我正在研究 Spring Interceptors,我知道它作为一个前端控制器工作,它可以服务一些请求和一些响应或全部,并且在执行流程中,请求在调用控制器之前先进入拦截器。 但是我想更了解它,例如,它的实时场景或用法是什么。 例如,我们可以将其用于会话管理,但我想了解更多。
2回复

Spring拦截器没有被调用

我开始使用spring拦截器,并希望简单地记录每个请求的调用时间。 我的拦截器类: 根的context.xml 控制器类 我没有控制器类的请求映射,而是直接将请求映射到方法。 (我知道这是一个不好的做法,但我正在努力:)) web.xml中 请求URL localhos
1回复

如何在拦截器上设置Spring3.1MVC控制器上的对象?

自升级到3.1以来,我遇到了几个与拦截器相关的问题。 在3.0.x及更早版本中,我使用以下模式拦截Spring MVC控制器: 创建一个名为RoleAware的接口,用于定义一个或多个setter。 让一个或多个控制器实现该接口 注册一个新的全局拦截器,它在preHandle
2回复

在Spring-mvc拦截器中,如何访问处理程序控制器方法?

在Spring-mvc拦截器中,我想访问处理程序控制器方法 我已经发现 : 如何对获得控制器,方法名,在弹簧拦截-prehandle法 但它只能解决。 我希望方法名称可以访问注释。
2回复

永远不会调用spring拦截器

我有以下拦截器: 它应该在请求处理之前拦截以下控制器方法: 这是spring-servlet.xml中的拦截器声明: 现在我的拦截器永远不会被调用,我不知道为什么?! 任何帮助
1回复

MVC拦截器与Spring安全过滤器vs其他东西......?

我在我的Web应用程序中使用Spring-MVC和Spring Security。 它包括用户注册页面和私人用户面板。 我现在设置了以下网址模式: whatever/myapp/login用户登录 whatever/myapp/register?step=1开始注册 wha