如何在GWT 2.10.0中仅开发环境禁用RPC Token,生产环境启用
实现GWT 2.10.0开发环境禁用RPC Token、生产环境保持启用的方案
核心思路
利用GWT自带的环境判断机制,结合RPC Token的验证逻辑分支,实现开发/生产环境的差异化配置。
方案一:通过服务端逻辑动态控制验证
利用GWT内置环境判断
GWT提供GWT.isProdMode()方法,编译时会自动替换为对应环境的布尔值:开发模式返回false,生产编译后返回true。无需额外传递参数。修改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替换拦截器
- 在模块配置中定义环境属性
在你的.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>
- 创建空实现的拦截器
public class NoOpXsrfInterceptor implements XsrfTokenInterceptor { @Override public void intercept(RPCRequest rpcRequest, HttpServletRequest request) throws XsrfTokenException { // 开发环境不做任何Token验证 } }
- 开发模式启动时指定环境参数
在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
相关产品推荐
相关产品推荐

