java.lang.IllegalStateException: UT010019: Response already commited ----已解决

java.lang.IllegalStateException: UT010019: Response already commited
抛异常的背景条件,使用Jfinal框架,使用类MultipartRequestExtend来完成文件上传功能,本质上MultipartRequestExtend最终继承自HttpServletRequestWrapper类,在限制文件上传大小时候,主动将异常抛出,最后报错。报错异常信息为:

[ERROR]-[Thread: XNIO-1 task-1]-[io.undertow.servlet.api.LoggingExceptionHandler.handleThrowable()]: UT005023: Exception handling request to /xxxxx
java.lang.IllegalStateException: UT010019: Response already commited
	at io.undertow.servlet.spec.HttpServletResponseImpl.sendError(HttpServletResponseImpl.java:168)
	at javax.servlet.http.HttpServlet.doPost(HttpServlet.java:315)
	at io.undertow.servlet.handlers.DefaultServlet.doPost(DefaultServlet.java:220)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:665)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:104)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

我的代码是框架抛出了ExceededSizeException异常,我主动catch,因为前后端分离,要将异常捕获,将信息返回给前端,所以我的代码如下:

public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
        if (isMultipart(request)) {
            MultipartRequestExtend multiRequest = null;
            try {
                multiRequest = new MultipartRequestExtend(request, "temp");
                uploadFileHandle(multiRequest);
                next.handle(target, multiRequest, response, isHandled);
            } catch (ErrorMsg e) {
                JSONObject json = new JSONObject();
                json.put("msg", e.getMessage());
                json.put("code", e.getCode());
                json.put("state", "fail");
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/json; charset=utf-8");
                response.setHeader("Access-Control-Allow-Origin", "*");//设置跨域
                //response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
                //response.setHeader("Access-Control-Allow-Headers", "x-requested-with, content-type, csrf-token");
                //response.setHeader("Access-Control-Allow-Credentials", "true");
                PrintWriter out = null;
                try {
                    out = response.getWriter();
                    out.print(json.toString());
                    out.flush();
                    out.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                } finally {
                    if (out != null) {
                        out.close();
                    }
                }
            }catch(ExceededSizeException ex){
                ex.printStackTrace();
                JSONObject json = new JSONObject();
                json.put("msg", "文件大小超出" + AssetService.UPLOAD_MAX_SIZE/1024/1000 + "M限制");
                json.put("code", "ERROR_FILE_MAX");
                json.put("state", "fail");
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/json; charset=utf-8");
                response.setHeader("Access-Control-Allow-Origin", "*");//设置跨域
                PrintWriter out = null;
                try {
                    out = response.getWriter();
                    out.print(json.toString());
                    out.flush();
                    out.close();
                } catch (IOException ioex) {
                    ioex.printStackTrace();
                } finally {
                    if (out != null) {
                        out.close();
                    }
                }
                //next.handle(target, request, response, isHandled);
                //throw new ErrorMsg("文件大小超出" + AssetService.UPLOAD_MAX_SIZE/1024/1000 + "M限制");

            }
        } else {
            next.handle(target, request instanceof HttpServletRequestExtend ? request : new HttpServletRequestExtend(request), response, isHandled);
        }
    }

可以看到异常中有一个语句如下,跟踪进去,会发现是想执行下一个Filter,再次要将response响应给前端,所以报错了

at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:104)

所以解决思路应该是不要继续执行下一个Filter了,要在这里中止Filter,不继续往下传播,这样就不会报错了。查询网上知识了解到isHandled为true则不往下执行,所以将isHandled置为true即可解决问题!!!

欢迎关注微信公众号:编码与生活,一起成长,小白的进阶之路

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值