render导致HTTP请求失败问题

问题描述

前端使用POST请求上传文件时,有可能文件过大,此时需要返回给前端的友善的提示,为了实现该功能,添加了一个handler对上传文件进行处理,如下:

    @Override
    public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        String contentType = request.getContentType();
        if (StrKit.notBlank(contentType) && contentType.contains(MULTIPART_CONTENT_TYPE)) {
            if (!(request instanceof MultipartRequest)) {
                try {
                    request = new MultipartRequest(request);
                } catch (ExceededSizeException e) {
                    log.error("上传文件大小超过限制", e);

                    //不在让后续的filter处理该请求
                    isHandled[0] = true;
                    
                    //返回响应
                    RespBody respBody = new RespBody();
                    respBody.setResult(ResultCode.UPLOAD_FILE_TO_LARGE);
                    RenderManager.me().getRenderFactory().getJsonRender(respBody).setContext(request, response).render();
                    return;
                }
            }
        }
        next.handle(target, request, response, isHandled);
    }

注:RespBody是自定义的类,用于和前端交互

但是发现前端的并不能处理此HTTP响应,如下:

image.png

上传文件请求直接失败,ajax代码如下:

    function upload() {
        $.ajax({
            url: '/api/v3/upload/batchUploadSong',
            type: 'POST',
            cache: false,
            data: new FormData($('#form')[0]),
            //告诉jquery不要处理发送的数据
            processData: false,
            //告诉jQuery不要去设置Content-Type请求头
            contentType: false
        }).done(function (result) {
            if (result.code === 200) {
                alert("成功");
            } else {
                alert(result.message);
            }
        }).fail(function (jqXHR) {
            alert("请检查上传压缩包是否过大,若过大,请分开上传;若压缩包大小符合要求,请联系工作人员");
        });
    }

其执行了.fail()中的代码.


思考

我看了JsonRender.render()的代码,就是简单的向response.getWriter()用写字符串,然后刷新,感觉应该不是jfinal框架的问题,而且也不应该出现此问题,没有什么排查的思路,请各位大佬指点~~

public void render() {
   if (jsonText == null) {
      buildJsonText();
   }
   
   PrintWriter writer = null;
   try {
      response.setHeader("Pragma", "no-cache");  // HTTP/1.0 caches might not implement Cache-Control and might only implement Pragma: no-cache
      response.setHeader("Cache-Control", "no-cache");
      response.setDateHeader("Expires", 0);
      
      response.setContentType(forIE ? contentTypeForIE : contentType);
      writer = response.getWriter();
        writer.write(jsonText);
        writer.flush();
   } catch (IOException e) {
      throw new RenderException(e);
   }
}


评论区

热门反馈

扫码入社