如何修复java下载按钮连续单击ClientBortException:java.io.IOException错误?

如何修复java下载按钮连续单击ClientBortException:java.io.IOException错误?,java,spring,Java,Spring,我的下载页面有两个下载(pdf和安装程序)按钮。当一个下载按钮只被点击一次时,它工作正常。但当连续单击时,它抛出一个ClientAbortException:java.io.IOException错误。我已经找到了很多关于ClientBortException的答案,但对我来说并不容易理解。有人能帮我修复这个错误吗 这是我在控制器中下载按钮的代码: @Repository public interface UserRepository extends JpaRepository<U

我的下载页面有两个下载(pdf和安装程序)按钮。当一个下载按钮只被点击一次时,它工作正常。但当连续单击时,它抛出一个
ClientAbortException:java.io.IOException
错误。我已经找到了很多关于ClientBortException的答案,但对我来说并不容易理解。有人能帮我修复这个错误吗

这是我在控制器中下载按钮的代码:

@Repository    
public interface UserRepository extends JpaRepository<User, Long> {
    User findByToken(String token);
}

@Controller
public class UserController {
    @RequestMapping(value = "download", method = RequestMethod.POST, params = "action=ins")
    public String downloadInstaller(HttpServletRequest request, HttpServletResponse response, @ModelAttribute User user, Model model)
            {

        User user2 = userRepository.findByToken(user.getToken());
        if(user2.getDownload() == 0) {
            user2.setDownload(1);
            userRepository.save(user2);

            File file = new File("File");
            download(file, response);
            log.info(Log.LOG_DOWNLOAD_INSTALLER);
            return "";
        }
        return "downloaded";
    }

    @RequestMapping(value = "download", method = RequestMethod.POST, params = "action=pdf")
    public String downloadPDF(HttpServletResponse response, @ModelAttribute User user, Model model) {       
        User user2 = userRepository.findByToken(user.getToken());
        if(user2.getDownload() == 0) {
            user2.setDownload(1);
            userRepository.save(user2);
            File file = new File("Pdf");
            download(file, response);
            log.info(Log.LOG_DOWNLOAD_PDF);
            return "";
        }
        return "downloaded";
    }

    public void download(File file, HttpServletResponse response) {

        try {
            InputStream is = new FileInputStream(file);
            response.setContentType("application/octet-stream");
            // Response header
            response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
            // Read from the file and write into the response
            OutputStream os = response.getOutputStream();

            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                os.write(buffer, 0, len);
            }
            os.flush();
            os.close();
            is.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {           
            e.printStackTrace();
        }   
    }
}
@存储库
公共接口用户存储库扩展了JpaRepository{
用户findByToken(字符串令牌);
}
@控制器
公共类用户控制器{
@RequestMapping(value=“download”,method=RequestMethod.POST,params=“action=ins”)
公共字符串下载安装程序(HttpServletRequest请求,HttpServletResponse响应,@ModelAttribute用户,Model模型)
{
User user2=userRepository.findByToken(User.getToken());
if(user2.getDownload()==0){
user2.setDownload(1);
userRepository.save(user2);
文件=新文件(“文件”);
下载(文件、响应);
log.info(log.log\u下载\u安装程序);
返回“”;
}
返回“已下载”;
}
@RequestMapping(value=“download”,method=RequestMethod.POST,params=“action=pdf”)
公共字符串下载PDF(HttpServletResponse,@ModelAttribute用户,Model模型){
User user2=userRepository.findByToken(User.getToken());
if(user2.getDownload()==0){
user2.setDownload(1);
userRepository.save(user2);
文件=新文件(“Pdf”);
下载(文件、响应);
log.info(log.log\u下载\u PDF);
返回“”;
}
返回“已下载”;
}
公共void下载(文件,HttpServletResponse){
试一试{
InputStream is=新文件InputStream(文件);
setContentType(“应用程序/八位字节流”);
//响应头
response.setHeader(“内容处置”、“附件;文件名=\”+文件.getName()+”\”);
//读取文件并写入响应
OutputStream os=response.getOutputStream();
字节[]缓冲区=新字节[1024];
内伦;
而((len=is.read(buffer))!=-1){
写操作(缓冲区,0,len);
}
os.flush();
os.close();
is.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE){
e、 printStackTrace();
}   
}
}

下载()方法的“os.flush();”行是否出现异常?如果是这样,这基本上意味着发送请求的客户机不再等待响应。如果您提出了两个请求,那么第一个请求可能失败


如果多次单击按钮没有什么特别的目的,我想您可以捕获并忽略download()中的异常?

while循环后,继续单击转到IOException。如果忽略异常,IE和Chrome不下载。