Java 云端点:访问Servlet筛选器中的参数

Java 云端点:访问Servlet筛选器中的参数,java,google-app-engine,guice,google-cloud-endpoints,servlet-filters,Java,Google App Engine,Guice,Google Cloud Endpoints,Servlet Filters,我正在尝试用谷歌云端点构建一个api 由于除了谷歌自己的OAuth之外,云端点不提供身份验证,所以我尝试构建自己的OAuth。因此,我希望访问servlet过滤器中为API提供的参数(例如@Named(“token”)token) 不幸的是,我在httpRequest中找不到任何提供的信息。这正常吗?是否有可能访问参数 如果有人能帮助我,我将不胜感激 更新: 使用jirungaray提供的信息,我尝试使用头构建身份验证,但遇到了同样的问题。使用REST客户端发送一些头,因为我不知道如何使用API

我正在尝试用谷歌云端点构建一个api

由于除了谷歌自己的OAuth之外,云端点不提供身份验证,所以我尝试构建自己的OAuth。因此,我希望访问servlet过滤器中为API提供的参数(例如@Named(“token”)token)

不幸的是,我在httpRequest中找不到任何提供的信息。这正常吗?是否有可能访问参数

如果有人能帮助我,我将不胜感激

更新:


使用jirungaray提供的信息,我尝试使用头构建身份验证,但遇到了同样的问题。使用REST客户端发送一些头,因为我不知道如何使用API资源管理器执行此操作。在我的过滤器中,我尝试从标题访问令牌:

@Override
public void doFilter(
        ServletRequest request,  ServletResponse response, FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest httpRequest = (HttpServletRequest) request;
    String authToken = httpRequest.getHeader(Constants.AUTH_TOKEN);
    ...
    chain.doFilter(request, response);
}
我之所以尝试这样做,是因为我正在使用Guice进行依赖项注入,并希望将我的令牌注入到另一个对象中

有了Guice,我就有了以下提供程序,它使用令牌为每个请求注入一个FacebookClient(使用令牌)

@Provides
public FacebookClient getFacebookClientProvider(@Named("fbToken") Provider<String> fbToken) {
    return new DefaultFacebookClient(fbToken.get(), Version.VERSION_2_2);
}
@提供
公共FacebookClient getFacebookClientProvider(@Named(“fbToken”)提供程序fbToken){
返回新的DefaultFacebookClient(fbToken.get(),Version.Version_2_2);
}
如guicewiki()中所述,它使用sevlet过滤器从请求中获取信息

有没有解决方案可以通过云端点实现这种DI?

Philip, 是的,您收到一个空请求是有道理的。您的端点调用首先由Google处理(它们接收API调用),然后处理这些调用并发送到应用程序中的处理程序。由于这些都是在后台完成的,因此很容易忽略您的端点实际上并没有收到与您发送的相同的请求,而是收到了来自Google基础设施的完全不同的请求

尽管您的方法应该可以工作,但在url中包含令牌信息会使它们更容易被嗅探,即使您使用SSL或加密参数,令牌也会清晰可见。 对于您试图实现的目标,我建议您将令牌作为头包含在请求中,并通过直接在端点上访问HTTPRequest来检索该头,如果您在端点方法中包含
HTTPServletRequest
参数,则会自动注入该头

例如


如果您仍然觉得应该使用您最初的方法,请发表评论,我将帮助您调试该问题

通常我不介意使用标题字段。我甚至更喜欢它。但是如何使用生成的客户端库设置此字段呢?使用此标题字段时,是否可以在筛选器中访问它?这样可以更容易地在端点之外自动化身份验证。这是否会使API explorer无法使用,因为我不知道如何在其中设置标题字段?我用有关我要解决的实际问题的更具体信息更新了问题。也许这有助于找到解决方案。你现在遇到了什么问题?当您使用筛选器拦截请求时,标头是否为空?在我的筛选器中,我尝试使用以下命令访问标头:httpRequest.getHeader(“令牌”);但是,如果你想让你的问题获得更多的视图,你真的应该把它作为你的标签之一。但是你只有5个,我不确定你更喜欢哪一个。可能吧,好的。谢谢你的建议。几分钟前刚取下。现在它又回来了!您可以通过将鼠标悬停在标签上,查看他们有多少关注者以及他们有多少问题,从而了解要包含哪些标签。像这样的小标签并不能真正帮助任何人找到你的问题,但许多人会搜索最近贴上标签的帖子。因此,选择最流行的标签,适合你的文章。现在,如果我知道如何解决你的问题就好了……:)很想知道。我当时的想法是:对于java标记,这个问题只是百万分之一,而在不太流行的标记中,人们在对主题有全面了解的同时,会更加关注这个标记。就我个人而言,大多数时候我都会看标记为java的最新/活跃的问题,有时会加入一些较小的标记(如)只有当有人有你的问题时,老问题才会被发现。
    public APIResponse doSomething(SomeComplexRquestModel request,
            HttpServletRequest rawRequest) {
}