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即可解决问题!!!
欢迎关注微信公众号:编码与生活,一起成长,小白的进阶之路


40万+

被折叠的 条评论
为什么被折叠?



