gpt4 book ai didi

java - 使用 Spring MVC 和自行实现的拦截器强制下载文件会产生一个奇怪的问题

转载 作者:行者123 更新时间:2023-12-01 06:46:10 25 4
gpt4 key购买 nike

我的所有 Controller 都扩展了以下抽象类:

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 {
}

}

这是我发现可以改进代码分解的解决方案,因为您不需要传递请求响应模型 作为 Controller 中的方法参数。该解决方案工作正常,直到我发现这个问题:

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 则生成一个实例化的。这应该对这个问题有一定的意义,但我找不到什么。

作为 Controller 方法的参数传递时,如何实例化响应

最佳答案

不要这样做:

public abstract class AbstractController {

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

}

Controller 中的实例变量(顺便说一句,其默认范围是单例)是一个坏主意。

关于java - 使用 Spring MVC 和自行实现的拦截器强制下载文件会产生一个奇怪的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12459334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com