我正在使用基于令牌的身份验证构建WebService,从soap头中提取令牌。我想监视/配置每个WebMethod,我想知道哪个用户调用了哪个WebMethod以及处理它需要多长时间。我不能使用外部监视工具,因为我仍然需要提取令牌,所以我知道哪个用户实际上调用了WebMethod。
我现在使用一个简单的类WebFilter,它在每个WebMethod手动调用之前,如果用户没有调用该方法的权限则抛出异常。但是在每种方法之前和计算时间之后添加像long start = System.currentMillis();
这样的东西并不是解决方案,因为我会有方法的趋势。
@WebService (serviceName = "UserService")
public class UserService implements IUserService {
@Resource
WebServiceContext wsctx;
@WebMethod
@Override
public User getUser(@WebParam(name = "name") String name) throws ServiceException {
WebFilter.filter(wsctx.getMessageContext());
return userManager.getUser(name);
}
我正在寻找像拦截器解决方案之类的东西,我需要在每个WebMethod之前和之后调用一些东西,但拦截器并不真正使用WebMethods所以我有点绝望。
在每个受监控的类之前解决注释:
@Interceptors({PerformanceInterceptor.class})
而这个拦截器的实现:
@AroundInvoke
public Object methodInterceptor(InvocationContext ctx) throws Exception {
long start = System.currentTimeMillis();
try {
return ctx.proceed();
} finally {
long end = System.currentTimeMillis();
System.out.println(ctx.getMethod().getName() + " took: " + (end - start) + "ms");
}
}