我正在使用基于令牌的AUTH构建Web服务,从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);
}
我正在寻找诸如Interceptors解决方案之类的东西,我需要在每个WebMethod之前和之后都打电话给某些东西,但是Interpectors并不能真正与WebMethod一起使用,所以我对此有点拼命。
在每个监视类之前用注释解决:
@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");
}
}