0

我正在使用 Resteasy 的客户端框架,并且我有一些方法需要对服务器进行身份验证。身份验证是通过会话票证实现的,并且该票证必须作为查询参数包含在请求 URL 中。默认情况下,我需要将票证传递给我的所有服务调用,如下所示:

@Path("/services")
public class MyServiceClient {

    @POST
    @Path("service1")
    public void callService1(@QueryParam("ticket") String ticket);

    @GET
    @Path("service2")
    @Produces("text/plain")
    public String callService2(@QueryParam("ticket") String ticket, ...);
}

但我不想将票证参数传递给我的每个服务调用。我需要一种解决方案,以一种通用的方式将其设置为每个调用的查询参数。因此,我的服务调用方法只会采用除票证之外的实际服务参数。但是,当请求服务时,票证将包含在请求 URL 中。

有没有办法做到这一点?

提前致谢。

4

2 回答 2

1

我认为您可以将 @PathParams 绑定到封闭类,以便它们可以在每个方法中使用而无需重新声明。我从未尝试过,但在这里看到了一个例子:http: //www.mastertheboss.com/web-interfaces/309-handling-web-parameters-with-resteasy.html

于 2011-05-06T22:16:37.347 回答
1

我也有同样的情况。很抱歉复活了一个旧线程,但无论如何......

与其将票证放在查询字符串上,不如将其作为 HTTP 标头包含,特别是像这样的 Authorization 标头:

Authorization: Token ABCD1234-1234-1234-1234-ABCD1234ABCD

您也可以接受基本身份验证。这让您可以在没有任何花哨的插件或扩展的情况下从 Web 浏览器中使用 API。标头看起来像这样:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

然后,在您的服务器端代码中,使用 HttpServletFilter 来保护对 RestEasyServlet 的所有访问。在 doFilter 方法中,读取 Authorization 标头。如果标头签出,则仅调用chain.doFilter(它将请求传递给RestEasyServlet)。如果它不存在或过期或无效等,则从您的过滤器返回 HTTP 401。

如果您的 auth 标头以“Token”开头,则去掉前六个字符,然后获取其余值并在会话数据库表或 Map 中进行查找。如果它在那里并且没有过期,那么让他们通过。

如果您的 auth 标头以“Basic”开头,则去掉前六个字符并 Base64 解码其余字符。拆分“:”并使用两个标记在数据库中查找用户。

我也在过滤器中作弊。由于无论如何我都必须从数据库中查找该令牌(或用户名/密码),因此我从 ResultSet 创建了一个 User 对象并将其存储在过滤器上的 ThreadLocal 中。然后我在我的过滤器上提供了一个静态方法,让我可以从 JVM 中的任何其他地方访问“当前用户”。我在过滤器中使用 try/finally 来清除 ThreadLocal,以便在请求完成后它总是会被清除。

于 2013-04-26T16:07:21.107 回答