我有一个webservice调用来获取授权令牌并将其用于后续的webservice调用。现在我们前面所做的是每当我们进行任何Web服务调用时,我们首先创建令牌Web服务,然后调用实际的Web服务。制作静态方法是否同步
获取令牌的方法如下所示。基本上这个代码所做的就是调用Web服务来获取令牌,并使用GSON解析响应并获取令牌。
public static String getAuthTicket() {
String authTicket = null;
HttpResponse httpResponse = getAuthResponse();
String body;
if (httpResponse.getStatusLine().getStatusCode() == 200) {
try {
body = IOUtils.toString(httpResponse.getEntity().getContent());
Gson gson = new GsonBuilder().disableHtmlEscaping().create();
ResponseTicket responseTicket = gson.fromJson(body, ResponseTicket.class);
authTicket = responseTicket.getTicket();
} catch (UnsupportedOperationException e) {
LOGGER.error("UnsupportedOperationException : ",e);
} catch (IOException e) {
LOGGER.error("IO Exception : ",e);
}
}
return authTicket;
}
这显然导致了性能问题。因此,提供Web服务来获取令牌的一方已经使该令牌有效30分钟。
因此,在上述方法中,我们所考虑的是将令牌与时间一起放入缓存中,并检查当前时间 - 缓存时间是否小于30.如果时间大于30,我们将进行服务调用获取令牌并用缓存中的时间戳更新令牌。
唯一让我担心的是关于同步,这样我就不会因为竞争条件而受到腐败。
我在想这个静态方法是同步的。你认为还有没有其他更好的方法?
两种操作之间的竞争条件? –
在进行任何后续Web服务调用之前获取身份验证令牌的争用条件 – noob
您在哪里存储/缓存身份验证令牌? – Markus