【问题标题】:Retrieve/Change url parameter in Action检索/更改操作中的 url 参数
【发布时间】:2014-09-29 02:57:56
【问题描述】:

我从前端向 userPrivateProfile 控制器拨打电话。路由是 /api/user/private/:id 所以假设我在 /api/user/ 拨打电话私人/65。在我执行控制器之前,请求被 SecurityAuthAction 接收,我确保请求标头具有令牌,如果是这种情况,我想将 :id 更改为不同的东西。

Controller.java

  @With(SecurityAuthAction.class)
        public Result userPrivateProfile(Long id) {
            //LOGIC
        }

SecurityAuthAction.java

public Promise<SimpleResult> call(Http.Context ctx) throws Throwable {
        String[] authTokenHeaderValues = ctx.request().headers()
                .get(AUTH_TOKEN_HEADER);
       
        if ((authTokenHeaderValues != null) && (authTokenHeaderValues.length == 1) && (authTokenHeaderValues[0] != null)) {
            Long userId = sessionService
                    .findUserByToken(authTokenHeaderValues[0]);
            ctx.args.put("id",userId.toString());
            
        return delegate.call(ctx);
    }

我的问题是

  1. 我无法检索使用 ctx 从原始调用中指定的 :id

  2. 由于我找不到请求参数在哪里,我也无法更改它

我尝试遍历 ctx.args 映射,但在那里没有找到任何东西。输出是:

ROUTE_VERB ROUTE_

ACTION_METHOD

ROUTE_CONTROLLER

ROUTE_COMMENTS

ROUTE_PATTERN

获取

userPrivateProfile

控制器.控制器

/api/user/private/$id

感谢您的帮助:)

【问题讨论】:

    标签: java http playframework playframework-2.0 playframework-2.1


    【解决方案1】:

    不幸的是,Play Framework(肯定是 2.1 版)在执行操作组合时无法让您轻松访问 URL 查询参数。 This discussion on the Play Google group 您可能会感兴趣。提到的一种解决方法是解析SecurityAuthAction 中的URL 以获取id 查询参数的值。但是,这有点混乱,并不能帮助您解决问题的下一部分,即在进入下游操作之前更改 id。

    在服务器处理请求时更改请求的详细信息对我来说似乎并不常见且错误。通常,如果您想更改客户端请求的内容,您会发出 HTTP 303 响应,将它们重定向到您希望它们访问的 URL。但这感觉不像是重定向的情况。我认为您应该做的只是将您对sessionService 的呼叫推送到您的主控制器类:

    SecurityAuthAction.java

    public Promise<SimpleResult> call(Http.Context ctx) throws Throwable {
    
        if (authorisation token header is present in request) {
            return delegate.call(ctx);
        }
    
        return unauthorised();
    }
    

    Controller.java

    @With(SecurityAuthAction.class)
    public Result userPrivateProfile(Long id) {
    
        // We've already established that an auth token header is present in the request
        final String authToken = ctx.request().headers().get(AUTH_TOKEN_HEADER)[0];
        final Long userId = sessionService.findUserByToken(authToken);
    
        // TODO: Proceed...
    }
    

    如果userId 是您在整个应用程序中都需要的东西,那么它可能是包含在您的应用程序 cookie 中的候选对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 2011-07-01
      • 2015-11-14
      相关资源
      最近更新 更多