0

我目前正在接受培训,并且正在开发使用 RESTEasy API 的 Android 应用程序,但我遇到了 ProxyFactory.create 方法(...,...)的一些问题。

让我解释一下:

我有两个 REST 服务。

验证服务:

    @Path("/authent/tokens")
    public interface AuthenticateService {

    // This method add a data "token" in cookie    
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public PostCustomerOutput createToken(PostCustomerInput postCustomerInput) throws ConnectException;

    @Path("/{id}")
    @DELETE
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Void deleteToken(@PathParam("id") String token);
}

注册服务:

 @Path("/enrollment/otp")
    public interface UserEnrollmentService {

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public PostGenerateOTPOutput postGenerateOTP(PostGenerateOTPInput postGenerateOTPInput);

    @POST
    @Path("/check")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public OutputImpl postCheckOTP(PostCheckOTPInput postCheckOTPInput);
}

在这两个服务上,我有一个拦截器来处理 Cookie 中恢复的数据。

授予访问拦截器:

public class GrantAccessInterceptor extends AbstractInDatabindingInterceptor {
    public GrantAccessInterceptor() {
        super(Phase.USER_STREAM);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
    HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);

    if (null != request) {
        // Read http header to get cookie/
        Cookie[] cookies = request.getCookies();
            if (cookies != null) {
                for (Cookie cook : cookies) {
                    if (cook.getName().equals("token")) {
                        log.info("Token find in cookies");
                        // TODO : do what I want with the cookie
                    }
                }
            } else {
                log.info("Cookies are empty !");
            }
        } 
    }
}

现在我写了以下测试:

@org.junit.Test
public void testCreateToken() {

    RegisterBuiltin.register(ResteasyProviderFactory.getInstance());
    // Recover AuthenticateService 
    AuthenticateService authenticateService = ProxyFactory.create(AuthenticateService.class, urlLocal, executor);
    // Recover UserEnrollmentService 
    UserEnrollmentService userEnrollmentService = ProxyFactory.create(UserEnrollmentService.class, urlLocal, executor);

    PostCustomerInput in = new PostCustomerInput();
    // put data in PostCustomerInput
    PostCustomerOutput out = authenticateService.createToken(in);
    // authenticateService.deleteToken(out.getCustomerToken());
    PostGenerateOTPInput postGenerateOTPInput = new PostGenerateOTPInput();
    userEnrollmentService.postGenerateOTP(postGenerateOTPInput);
}

当我调用该方法authenticateService.createToken时,我GrantAccessInterceptor会显示正确的消息“Cookie 为空!” 这是正常的,因为 cookie 被添加到 createToken 方法中。现在,如果我deleteToken在同一个服务(AuthenticateService)上调用方法,我会收到消息“在 cookies 中找到令牌”,这没问题。

在那之前一切都很好。

现在,如果在调用AuthenticateService我的 UserEnrollmentService 的方法 createToken 之后,GrantAccessInterceptor 在 cookie 中找不到任何东西 ... -> “Cookie 是空的!”

我认为问题出ProxyFactory在不同服务之间不共享cookie。

4

1 回答 1

0

ProxyFactory处理 cookie不是工作,这取决于ClientExecutor.

通过将其传递ClientExecutorProxyFactory,您应该能够共享 cookie:

ApacheHttpClient4Executor executor = new ApacheHttpClient4Executor();
ProxyFactory.create(ServiceIntf1.class, "http://my-service-url", executor);
ProxyFactory.create(ServiceIntf1.class, "http://my-service-url", executor);
于 2013-05-15T13:12:37.990 回答