如何修改GWT-RPC调用的响应状态码?
修改GWT-RPC调用的响应状态码
GWT-RPC的默认行为是:无论调用成功还是抛出异常,服务器始终返回200 OK状态码,异常信息会被序列化到响应体中,由客户端AsyncCallback.onFailure处理。要针对特定异常返回自定义HTTP状态码(如401、400),可以通过重写服务端Servlet的核心处理方法实现。
解决方案步骤
1. 创建自定义Servlet基类
继承AbstractXsrfProtectedServiceServlet,重写processCall方法,在捕获目标异常时设置响应状态码:
import com.google.gwt.user.server.rpc.AbstractXsrfProtectedServiceServlet; import com.google.gwt.user.server.rpc.SerializationException; import javax.servlet.http.HttpServletResponse; public class CustomXsrfServiceServlet extends AbstractXsrfProtectedServiceServlet { @Override public String processCall(String payload) throws SerializationException { try { return super.processCall(payload); } catch (UnAuthorizedException ex) { // 设置401未授权状态码 getThreadLocalResponse().setStatus(HttpServletResponse.SC_UNAUTHORIZED); throw ex; // 继续抛出异常,让GWT-RPC正常序列化异常内容 } catch (IllegalArgumentException ex) { // 设置400错误请求状态码 getThreadLocalResponse().setStatus(HttpServletResponse.SC_BAD_REQUEST); throw ex; } // 可扩展其他异常类型的状态码映射 } }
2. 修改服务实现类继承自定义基类
将原ServiceImpl的父类替换为上述自定义Servlet:
public class ServiceImpl extends CustomXsrfServiceServlet implements Service { public boolean doSomething(String something) throws Exception { if (!something.isEmpty()) { try { log("Something done"); return true; } catch (UnAuthorizedException uae) { // 直接抛出异常,由基类处理状态码设置 throw uae; } } return false; } }
关键说明
- 异常序列化要求:自定义异常(如
UnAuthorizedException)必须实现Serializable或com.google.gwt.user.client.rpc.IsSerializable接口,确保GWT-RPC能正常序列化异常信息。 - 客户端行为:设置状态码后,客户端
AsyncCallback.onFailure仍会正常触发,同时HTTP响应头中的状态码会被修改为目标值。需注意:若设置401状态码,部分浏览器可能自动弹出HTTP基本认证弹窗,需根据业务场景调整。 - 响应格式兼容性:上述方案保留了GWT-RPC的响应体格式,确保客户端能正常解析异常。若完全自定义响应内容,需修改客户端调用方式(如使用
RequestBuilder),但会失去GWT-RPC的自动序列化能力。
内容的提问来源于stack exchange,提问作者authorizeduser
相关产品推荐
相关产品推荐

