在Action中检索/更改url参数

时间:2014-09-29 02:57:57

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

我从我的前端拨打到userPrivateProfile控制器。路由是 / api / user / private /:id 所以我要说我在 /打电话API /用户/私有/ 65 。在我执行控制器之前,SecurityAuthAction会拦截请求,我确保请求标头包含令牌,如果是这样,我想将:id 更改为不同的。 / p>

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. 由于我无法找到请求参数的位置,因此无法更改

  3. 我尝试迭代ctx.args地图,但我在那里找不到东西。输出是:

      

    ROUTE_VERB ROUTE_

         

    ACTION_METHOD

         

    ROUTE_CONTROLLER

         

    ROUTE_COMMENTS

         

    ROUTE_PATTERN

         

    获取

         

    userPrivateProfile

         

    controllers.Controller

         

    / API /用户/私有/ $ ID的百分比抑制率^ /] + GT;

    Thanx求助:)

1 个答案:

答案 0 :(得分: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中的候选者。