GWT - 如何为 RPC servlet 中的所有传入请求设置入口点方法
GWT - how to set an entry point method for all incomming requests in RPC servelet
我有一个 RemoteServiceServlet class 实现了几个服务(方法)。
所有方法都需要在执行任何操作之前检查会话并获取相应的用户信息。由于 class 有 20 多个服务方法,因此在每个服务中都这样做是一场噩梦。有没有办法 运行 一些会话自动检查所有传入请求的方法?或者我该如何解决这个问题?
这是针对我的情况的示例伪代码。
public class OnboardingServiceImpl extends RemoteServiceServlet implements OnboardingService {
private String checkSessionAndGetUser(){...}
public void service1(){
// check session
// get user and do something based on the user data
}
public void service2(){
// check session
// get user and do something based on the user data
}
public void service3(){
// check session
// get user and do something based on the user data
}
...
public void service20(){
// check session
// get user and do something based on the user data
}
}
如您所见,service1、service2、...、service 20 都需要根据session 获取用户信息,但我不想为每个服务重复编写代码。任何帮助将不胜感激。
RemoteServletServlet
的doPost
是final
,但不是service
,所以你可以把你的代码放在那里。
...或使用 servlet 过滤器。
然而,这将在 "RPC" 之外完成(甚至在请求被解码之前),因此响应不能只是 "throw exception and have it passed to onFailure
on client side".
为此,您必须使用面向方面的编程(例如 AspectJ)将 "inject" 代码写入所有方法,或者在每个方法的开头调用一个 init 方法(您将不断重复代码,但这可能会减少到一行)。
我建议覆盖 processCall(RPCRequest rpcRequest)
@Override
public String processCall(RPCRequest rpcRequest) throws SerializationException {
//your checks here, in case of error:
//return RPC.encodeResponseForFailedRequest(null, new Exception("Invalid session"));
// note that you'll have to use a serializable exception type here.
return super.processCall(rpcRequest);
}
我有一个 RemoteServiceServlet class 实现了几个服务(方法)。 所有方法都需要在执行任何操作之前检查会话并获取相应的用户信息。由于 class 有 20 多个服务方法,因此在每个服务中都这样做是一场噩梦。有没有办法 运行 一些会话自动检查所有传入请求的方法?或者我该如何解决这个问题?
这是针对我的情况的示例伪代码。
public class OnboardingServiceImpl extends RemoteServiceServlet implements OnboardingService {
private String checkSessionAndGetUser(){...}
public void service1(){
// check session
// get user and do something based on the user data
}
public void service2(){
// check session
// get user and do something based on the user data
}
public void service3(){
// check session
// get user and do something based on the user data
}
...
public void service20(){
// check session
// get user and do something based on the user data
}
}
如您所见,service1、service2、...、service 20 都需要根据session 获取用户信息,但我不想为每个服务重复编写代码。任何帮助将不胜感激。
RemoteServletServlet
的doPost
是final
,但不是service
,所以你可以把你的代码放在那里。
...或使用 servlet 过滤器。
然而,这将在 "RPC" 之外完成(甚至在请求被解码之前),因此响应不能只是 "throw exception and have it passed to onFailure
on client side".
为此,您必须使用面向方面的编程(例如 AspectJ)将 "inject" 代码写入所有方法,或者在每个方法的开头调用一个 init 方法(您将不断重复代码,但这可能会减少到一行)。
我建议覆盖 processCall(RPCRequest rpcRequest)
@Override
public String processCall(RPCRequest rpcRequest) throws SerializationException {
//your checks here, in case of error:
//return RPC.encodeResponseForFailedRequest(null, new Exception("Invalid session"));
// note that you'll have to use a serializable exception type here.
return super.processCall(rpcRequest);
}