Liferay 7.3中MVC Resource Command执行结果如何被JavaScript正确识别
问题原因
MVCResourceCommand的serveResource方法返回的布尔值不控制HTTP响应状态:返回true只是告诉Liferay继续执行后续匹配到的其他ResourceCommand,返回false表示终止命令链,不管返回什么值,只要服务端正常接收到请求并完成处理,默认HTTP响应状态都是200- XMLHttpRequest的
onerror只会在网络层面请求失败时触发:比如跨域被拦截、DNS解析失败、连接超时、服务器完全无响应等,只要服务端返回了响应(哪怕是4xx、5xx状态码),都会走onload回调
解决方法
方案1:服务端设置HTTP状态码,前端判断响应状态
捕获异常时给响应设置非2xx的错误状态码,前端直接判断状态即可:
import javax.servlet.http.HttpServletResponse; public boolean serveResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) { try { // 你的业务代码 resourceResponse.setStatus(HttpServletResponse.SC_OK); return false; }catch(Exception e){ // 出错时设置500错误状态码 resourceResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); return true; } }
前端onload回调中新增状态判断:
req.onload = function (event) { if (req.status >= 200 && req.status < 300) { console.log("success"); } else { console.log("error"); } }
方案2:响应体返回业务状态标识,前端解析判断
不需要修改HTTP状态码的场景,可以在响应中返回自定义业务状态:
import java.io.PrintWriter; public boolean serveResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) { try { // 你的业务代码 resourceResponse.setContentType("application/json"); PrintWriter writer = resourceResponse.getWriter(); writer.write("{\"success\":true}"); writer.flush(); return false; }catch(Exception e){ resourceResponse.setContentType("application/json"); PrintWriter writer = resourceResponse.getWriter(); writer.write("{\"success\":false, \"errorMsg\":\"业务执行出错\"}"); writer.flush(); return true; } }
前端解析响应内容判断执行结果:
req.onload = function (event) { const result = JSON.parse(req.responseText); if (result.success) { console.log("success"); } else { console.log("error:" + result.errorMsg); } }
内容的提问来源于stack exchange,提问作者Janine
相关产品推荐
相关产品推荐

