我正在使用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, ...);
}
但我不想将ticket参数传递给我的每个服务调用。我需要一个解决方案,以常见方式将其设置为每个调用的查询参数。因此,我的服务调用方法只会获取除票证以外的实际服务参数。但是,当请求服务时,票证将包含在请求URL中。
有办法做到这一点吗?
提前致谢。
答案 0 :(得分:1)
我认为您可以将@PathParams绑定到封闭类,以便可以在每个方法中使用它们而无需重新声明。我从未尝试过,但看到了一个例子,这里: http://www.mastertheboss.com/web-interfaces/309-handling-web-parameters-with-resteasy.html
答案 1 :(得分:1)
我有同样的情况。抱歉复活旧线程,但无论如何......
不是将票证放在查询字符串上,为什么不将它包含在HTTP标头中,特别是像这样的Authorization标头:
Authorization: Token ABCD1234-1234-1234-1234-ABCD1234ABCD
你也可以接受Basic auth。这让我们从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,以便在请求完成后它总是被清除。