You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:27:09