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

如何在GWT 2.10.0中仅开发环境禁用RPC Token,生产环境启用

实现GWT 2.10.0开发环境禁用RPC Token、生产环境保持启用的方案

核心思路

利用GWT自带的环境判断机制,结合RPC Token的验证逻辑分支,实现开发/生产环境的差异化配置。


方案一:通过服务端逻辑动态控制验证

  1. 利用GWT内置环境判断
    GWT提供GWT.isProdMode()方法,编译时会自动替换为对应环境的布尔值:开发模式返回false,生产编译后返回true。无需额外传递参数。

  2. 修改RPC Servlet的验证逻辑
    在自定义的RemoteServiceServlet子类中,添加环境判断跳过Token验证:

public class CustomRemoteServiceServlet extends RemoteServiceServlet {
    @Override
    protected void onBeforeRequestDeserialized(String serializedRequest) {
        // 仅生产环境执行Token验证
        if (GWT.isProdMode()) {
            try {
                XsrfTokenService.getTokenValidators().validateToken(getThreadLocalRequest());
            } catch (XsrfTokenException e) {
                throw new ServletException("Invalid XSRF token", e);
            }
        }
        super.onBeforeRequestDeserialized(serializedRequest);
    }
}

方案二:通过模块XML替换拦截器

  1. 在模块配置中定义环境属性
    在你的.gwt.xml文件中添加环境属性配置:
<define-property name="gwt.env" values="dev,prod" />
<set-property name="gwt.env" value="prod" /> <!-- 默认生产环境 -->

<!-- 开发环境替换为空实现拦截器 -->
<replace-with class="com.yourpackage.NoOpXsrfInterceptor" when-property-is="gwt.env" value="dev">
    <when-type-is class="com.google.gwt.user.server.rpc.XsrfTokenInterceptor" />
</replace-with>
  1. 创建空实现的拦截器
public class NoOpXsrfInterceptor implements XsrfTokenInterceptor {
    @Override
    public void intercept(RPCRequest rpcRequest, HttpServletRequest request) throws XsrfTokenException {
        // 开发环境不做任何Token验证
    }
}
  1. 开发模式启动时指定环境参数
    在IDE的运行配置中添加JVM参数:-Dgwt.env=dev,即可触发拦截器替换。

方案三:客户端控制Token获取逻辑

如果需要在客户端跳过Token请求,可在RPC异步实现类中添加环境判断:

public class YourRpcServiceAsyncImpl extends RemoteServiceProxy implements YourRpcServiceAsync {
    public YourRpcServiceAsyncImpl(String moduleBaseURL, String remoteServiceRelativePath, SerializationPolicy serializationPolicy) {
        super(moduleBaseURL, remoteServiceRelativePath, serializationPolicy);
    }

    @Override
    public void yourRpcMethod(AsyncCallback<YourResult> callback) {
        if (!GWT.isProdMode()) {
            // 开发环境直接发起请求,不携带Token
            super.doInvoke(callback, "yourRpcMethod", new Object[]{});
        } else {
            // 生产环境先获取Token再发起请求
            XsrfTokenServiceAsync.Util.getInstance().getXsrfToken(new AsyncCallback<XsrfToken>() {
                @Override
                public void onSuccess(XsrfToken token) {
                    setRequestHeader("X-XSRF-Token", token.getToken());
                    super.doInvoke(callback, "yourRpcMethod", new Object[]{});
                }

                @Override
                public void onFailure(Throwable caught) {
                    callback.onFailure(caught);
                }
            });
        }
    }
}

内容的提问来源于stack exchange,提问作者abdel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:45:55